我遇到了这个方法定义:
def stock_folder_map
res = {}
folders.each { |ff|
ff.stocks.each { |s|
res[s["id"]] = ff["name"]
}
}
end
有人可以说出res = {}
和res[s["id"]] = ff["name"]
是什么意思吗?
答案 0 :(得分:4)
您正在构建名为res
的新哈希。您将遍历stock
中的每个folder
,并在res
中创建一个新元素,其中键是股票的ID,值是文件夹的名称。< / p>
答案 1 :(得分:2)
res = {}
正在为变量res
分配一个新的空Hash object。
res[s["id"]] = ff["name"]
分配给s["id"]
评估的任何键,从另一个哈希ff
检索的值。
因此,如果例如[s["id"]]
评估为:foo
而ff["name"]
评估为"bar"
,则上述等同于:
res[:foo] = "bar"
现在那些[]
是通过提供密钥来访问哈希的文字。在这种情况下,键是:
s["id"]
(这是另一个哈希)res
哈希和
"name"
代表ff
哈希。 s
最可能是另一个哈希值。
答案 2 :(得分:2)
res = {}
声明一个局部变量res
并为其分配一个空哈希。使用[]
对哈希进行索引,在Ruby术语中,这意味着哈希实例响应 []
消息,并产生与传递给{{1}的键值相对应的值。 }。
同时[]
依次将folders.each
集合的每个元素生成循环体,依次将每个元素分配给循环变量folders
。鉴于其用法,ff
必须同时回复ff
和stocks
。 []
执行此操作的一种可能方法是将其作为类的实例,例如下面列出的ff
:
ClassOfFF
class ClassOfFF
def stocks
# Yield a collection (implementing Enumerable, for example)
end
def [](key)
# Yield the element at "key"
end
end
返回的集合中的每个对象都必须自行回复stocks
。例如,这些对象也可能是显式响应[]
的另一个类的哈希或实例,例如[]
。
语句ClassOfFF
在res[s["id"]] = ff["name"]
和[]
上调用ff
,并使用密钥将ss
的值分配给ff["name"]
中的元素res
。
答案 3 :(得分:1)
res = {}
是一个哈希对象。res[s["id"]]
是一个哈希哈希。ff["name"]
是另一个哈希。res[s["id"]] = ff["name"]
表示你把哈希值{{1}密钥ff
上的哈希"name"
的值{({1}}的密钥)。}
答案 4 :(得分:1)
一些可能有帮助的伪代码。
def stock_folder_map
res = {} # creates a new hash map named 'res'
folders.each { |ff| # for each folder in folders (ff = folder)
ff.stocks.each { |s| # for each stock in ff.stocks (s = stock)
# we see that s is a hash map
res[s["id"]] = ff["name"] # let id = s["id"] i.e. s.get("id") in java
# let name = ff["name"] i.e. ff.get("name") in java
# assign value in res i.e. res.put(id, name) in java
}
}
end
Hashes的文档可能很有用。