-1

我遇到了这个方法定义:

def stock_folder_map
  res = {}
  folders.each { |ff|
    ff.stocks.each { |s|
      res[s["id"]] = ff["name"]
    }
  }
end

谁能说出什么res = {}res[s["id"]] = ff["name"]意思?

4

5 回答 5

4

您正在构建一个名为res. 您正在遍历 everystock中的 every folder,并创建一个新元素,res其中键是股票的 id,值是文件夹的名称。

于 2013-08-06T20:08:00.843 回答
2

res = {}正在为变量分配res一个新的空Hash 对象

res[s["id"]] = ff["name"]正在分配s["id"]从另一个哈希中检索到的任何键的值,ff

因此,例如,如果[s["id"]]评估为:fooff["name"]评估为"bar",则上述内容等同于:

res[:foo] = "bar"

现在这些[]是通过提供密钥来访问散列的文字。在这种情况下,键是:

  • s["id"](这是另一个哈希)用于res哈希和
  • "name"ff哈希。

s很可能是另一个哈希。

于 2013-08-06T20:05:10.043 回答
2

res = {}声明一个局部变量res并为其分配一个空哈希。哈希是使用索引[]的,在 Ruby 术语中,这意味着哈希实例响应消息并产生一些与传递给的[]键值相对应的值[]

同时folders.eachfolders集合的每个元素依次生成给循环体,将每个元素依次分配给循环变量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"]

于 2013-08-06T20:05:19.717 回答
1

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".

于 2013-08-06T19:57:11.973 回答
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的文档可能很有用。

于 2013-08-06T20:11:44.257 回答