我遇到了这个方法定义:
def stock_folder_map
res = {}
folders.each { |ff|
ff.stocks.each { |s|
res[s["id"]] = ff["name"]
}
}
end
谁能说出什么res = {}和res[s["id"]] = ff["name"]意思?
我遇到了这个方法定义:
def stock_folder_map
res = {}
folders.each { |ff|
ff.stocks.each { |s|
res[s["id"]] = ff["name"]
}
}
end
谁能说出什么res = {}和res[s["id"]] = ff["name"]意思?
您正在构建一个名为res. 您正在遍历 everystock中的 every folder,并创建一个新元素,res其中键是股票的 id,值是文件夹的名称。
res = {}正在为变量分配res一个新的空Hash 对象。
res[s["id"]] = ff["name"]正在分配s["id"]从另一个哈希中检索到的任何键的值,ff。
因此,例如,如果[s["id"]]评估为:foo并ff["name"]评估为"bar",则上述内容等同于:
res[:foo] = "bar"
现在这些[]是通过提供密钥来访问散列的文字。在这种情况下,键是:
s["id"](这是另一个哈希)用于res哈希和"name"为ff哈希。s很可能是另一个哈希。
res = {}声明一个局部变量res并为其分配一个空哈希。哈希是使用索引[]的,在 Ruby 术语中,这意味着哈希实例响应消息并产生一些与传递给的[]键值相对应的值[]。
同时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必须自己响应[]。例如,这些对象也可能是明确响应[]like的另一个类的哈希或实例ClassOfFF。
该语句同时res[s["id"]] = ff["name"]调用and并将 的值分配给with key中的元素。[]ffssff["name"]ress["id"]
res = {} is an Hash object.res[s["id"]] is an Hash of Hash.ff["name"] is another Hash.res[s["id"]] = ff["name"] means you are putting the value of the Hash ff at key "name",to the value (which is a key of res) of the Hash s at key "id".
一些可能有帮助的伪代码。
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的文档可能很有用。