實際上我是 ruby?? 中的 oops 概念的新手,在這里我想將實體變數從一個函式呼叫到同一類中的另一個函式。但是我得到了第二個函式“one_object”的未定義方法
module User
class Object
class << self
def add_object(items)
@data={}
@data.merge!(items)
end
# i want to use above @data = {} for next one_object method after adding items to the add_object method
def one_object
@data.merge!({"ext"=>"1.0"})
end
end
end
end
a = User::Object.add_object({"txt"=>"text_file","csv"=>"csv_file"})
p a.one_object
預期輸出:
{"txt"=>"text_file", "csv"=>"csv_file", "ext"=>"1.0"}
uj5u.com熱心網友回復:
在 Ruby 中,Object是所有物件的根類。盡管您可以在 中擁有自己的Object類User,但這可能會引起很多混亂。
讓我們通過洗掉User模塊(它與示例無關)并重命名Object為Foo(您會找到更好的名稱)來簡化您的問題。要初始化實體變數,您可以使用initialize每次構造物件時默認呼叫的方法new:
class Foo
def initialize
@data = {}
end
end
foo = Foo.new
#=> #<Foo:0x00007fb551823d78 @data={}>
# ^^^^^^^^
您分配給的哈希@data將在所有實體方法之間共享。此外,每個Foo實體都有自己的@data哈希值。將merge!另一個散列放入其中,您可以使用:
class Foo
def initialize
@data = {}
end
def add(hash)
@data.merge!(hash)
end
end
foo = Foo.new
#=> #<Foo:0x00007fbc80048230 @data={}>
foo.add({"abc"=>123})
#=> {"abc"=>123}
foo.add({"def"=>456})
#=> {"def"=>456}
foo
#=> #<Foo:0x00007fbc80048230 @data={"abc"=>123, "def"=>456}>
為了鏈接多個add呼叫(所謂的流暢介面),您必須self從方法內部回傳:
class Foo
def initialize
@data = {}
end
def add(hash)
@data.merge!(hash)
self # <- like this
end
end
foo = Foo.new
#=> #<Foo:0x00007ff7408003d8 @data={}>
foo.add({"abc"=>123}).add({"def"=>456})
#=> #<Foo:0x00007ff7408003d8 @data={"abc"=>123, "def"=>456}>
最后,要添加靜態資料,您可以簡單地呼叫自己的方法:
class Foo
def initialize
@data = {}
end
def add(hash)
@data.merge!(hash)
self
end
def add_more
add({"more" => 789})
end
end
foo = Foo.new
#=> #<Foo:0x00007f99b20f8590 @data={}>
foo.add({"abc"=>123}).add({"def"=>456}).add_more
#=> #<Foo:0x00007f99b20f8590 @data={"abc"=>123, "def"=>456, "more"=>789}>
uj5u.com熱心網友回復:
您分配的結果add_object來a(即你a現在是一個Hash),但下次你要呼叫one_object的a(但是one_object是的一部分User::Object,而不是你的Hash實體)。
如果添加到add_object包含 的另一行self,您將收到預期的輸出。
隨著更改,add_object將回傳User::Object,并且您不會遇到最初的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/400112.html
標籤:红宝石
