initialize
中 LocationList
方法中的变量 value
在第014行中填充。这些更改由第015行中的 print
语句固定,但是第016行中的 return
仍认为哈希仍然是空的,哈希仍然为空(滚动在=>
之后查看返回值)。
def random_point
x = rand * 2.0 - 1.0
y = rand * 2.0 - 1.0
until x**2 + y**2 < 1.0
x = rand * 2.0 - 1.0
y = rand * 2.0 - 1.0
end
return [x, y]
end
class LocationList < Hash
def initialize(node_list)
value = {}
node_list.each {|node| value[node] = random_point }
print value
return value
end
end
z = ["moo", "goo", "gai", "pan"]
LocationList.new(z)
#=> {"moo"=>[0.17733298257484997, 0.39221824315332987], "goo"=>[-0.907202436634851, 0.3589265999520428], "gai"=>[0.3910479677151635, 0.5624531973759821], "pan"=>[-0.37544369339427974, -0.7603500269538608]}=> {}
在全局函数中进行基本相同的操作会产生预期的返回值:
def foo(node_list)
value = {}
node_list.each {|node| value[node] = random_point }
return value
end
foo(z)
#=> {"moo"=>[-0.33410735869573926, -0.4087709899603238], "goo"=>[0.6093966465651919, 0.6349767372996336], "gai"=>[0.718925625951371, -0.6726652512124924], "pan"=>[0.08604969147566277, -0.518636160280254]}
您正在创建一个新的哈希,您可以在initialize
方法中调用value
,而不是初始化self
。说明此内联:
class LocationList < Hash
def initialize(node_list)
# self is already a LocationList, which is a Hash
value={}
# value is now a new Hash
node_list.each {|node| value[node]=random_point}
# value now has keys set
return value
# value is now discarded
# LocationList.new returns the constructed object; it does not return
# the result of LocationList#initialize
end
end
而是尝试一下:
class LocationList < Hash
def initialize(node_list)
node_list.each {|node| self[node]=random_point}
end
end
请注意,您实际上并未调用initialize
,您正在调用new
,然后调用initialize
。new
扔掉initialize
的返回值,而始终返回刚刚创建的对象。在Class#new
的实现中可以清楚地看到这一点。
由于您已经在想要的哈希中,不要创建另一个哈希(value
),只需使用您在中的一个即可(self
)!这将您的initialize
降低到:
def initialize(node_list)
node_list.each { |node| self[node] = random_point }
end