Ruby语法混乱

时间:2013-08-06 19:56:15

标签: ruby

我遇到了这个方法定义:

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

有人可以说出res = {}res[s["id"]] = ff["name"]是什么意思吗?

5 个答案:

答案 0 :(得分:4)

您正在构建名为res的新哈希。您将遍历stock中的每个folder,并在res中创建一个新元素,其中键是股票的ID,值是文件夹的名称。< / p>

答案 1 :(得分:2)

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

res[s["id"]] = ff["name"]分配给s["id"]评估的任何键,从另一个哈希ff检索的值。

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

res[:foo] = "bar"

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

    {li> s["id"](这是另一个哈希)res哈希和
  • "name"代表ff哈希。

s最可能是另一个哈希值。

答案 2 :(得分:2)

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

同时[]依次将folders.each集合的每个元素生成循环体,依次将每个元素分配给循环变量folders。鉴于其用法,ff必须同时回复ffstocks[]执行此操作的一种可能方法是将其作为类的实例,例如下面列出的ff

ClassOfFF

class ClassOfFF def stocks # Yield a collection (implementing Enumerable, for example) end def [](key) # Yield the element at "key" end end 返回的集合中的每个对象都必须自行回复stocks。例如,这些对象也可能是显式响应[]的另一个类的哈希或实例,例如[]

语句ClassOfFFres[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的文档可能很有用。