【问题标题】:Rails Model Syntax ConfusionRails 模型语法混乱
【发布时间】:2013-08-07 10:04:36
【问题描述】:

我在使用 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​​ 脚本中使用此代码的正确格式是什么?

【问题讨论】:

  • """ 分隔块注释。您还可以使用=begin=end 分隔块注释。
  • 不,它没有。这是三个彼此相邻的字符串文字。块 cmets 用 =begin=end 分隔,引号分隔字符串文字而不是 cmets。
  • 有什么困惑?问题是什么?为什么你把所有实际有用的东西都删掉了,让答案完全没用?
  • 等待几分钟,我正在重新编写整个代码以使问题更清楚,抱歉保存编辑。

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


【解决方案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 属性。股票是一个哈希数组。

【讨论】:

  • 当我调用函数 format_with_folders(stocks) 时,函数参数是什么?
【解决方案2】:

在 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)可能会完全消除它,将它编译成空。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多