Rails模型语法混淆

时间:2013-08-07 10:04:36

标签: ruby-on-rails ruby ruby-on-rails-3 mongoid

我在使用mongodb的Rails应用程序中遇到了这段代码:

  """
 Folder format:
{
  name: <folder name>,
  stocks: [
    {
      name: <stock name>,
      id: <stock id>,
      qty: <stock quantity>
    }
  ]
}
 """

  def format_with_folders(stocks)
   fmap = stock_folder_map
   res = stocks.group_by {|s| fmap[s["id"]] }.collect {|fname, ss|
    {
     "name" => fname,
     "stocks" => ss
    }
  }
  new(folders: res)
 end


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

怀疑是: 1)三重引号内的代码表示什么?是评论代码吗? 2)在ruby脚本中使用此代码的正确格式是什么?

2 个答案:

答案 0 :(得分:1)

首先,三引号字符串通常用作注释,就是这种情况。

要使其在类之外工作,您需要创建一个文件夹方法,该方法返回正确结构中的文件夹数组。你可以这样做:

Folder = Struct.new(:name, :stocks)

def folders
  [
    Folder.new(
      "Folder 1",
      [
        { "name" => "stock name", "id" => "stock id", "qty" => 3 },
        { "name" => "stock name", "id" => "stock id", "qty" => 5 }
      ]
    ),
    Folder.new(
      "Folder 2",
      [
        { "name" => "stock name", "id" => "stock id", "qty" => 2 },
        { "name" => "stock name", "id" => "stock id", "qty" => 1 }
      ]
    )
  ]
end

def format_with_folders(stocks)
  # ...
end

def stock_folder_map
  # ...
end

folders方法返回Folder个对象的数组,这两个对象都具有namestocks属性。股票是一系列哈希。

答案 1 :(得分:1)

在Ruby中,如果你有多个字符串文字彼此相邻,它们会在分析时连接起来:

'foo' "bar"
# => 'foobar'

这是受C启发的功能。

那么,你在那里有三个字符串文字彼此相邻。第一个字符串文字是空字符串:

""

然后是另一个字符串文字:

"
Folder format:
 {
   name: <folder name>,
    stocks: [
     {
      name: <stock name>,
      id: <stock id>,
      qty: <stock quantity>
     }
            ]
 }
"

最后,还有第三个字符串文字,它又是空的:

""

在解析时,它将连接成一个字符串文字:

"
Folder format:
 {
   name: <folder name>,
    stocks: [
     {
      name: <stock name>,
      id: <stock id>,
      qty: <stock quantity>
     }
            ]
 }
"

由于此字符串对象未被任何引用,未分配给任何变量,不会从任何方法或块返回,它将立即被垃圾收集。

换句话说:整个事情都是无操作,它是死代码。一个足够聪明的Ruby编译器(如JRuby或Rubinius)可能会完全消除它,将其编译成无。