Rails:named_scope,lambda和blocks

Gav*_*Gav 52 ruby lambda ruby-on-rails

我认为以下两个是等价的:

named_scope :admin, lambda { |company_id| {:conditions => ['company_id = ?', company_id]} }

named_scope :admin, lambda do |company_id| 
  {:conditions => ['company_id = ?', company_id]}
end
Run Code Online (Sandbox Code Playgroud)

但Ruby抱怨道:

ArgumentError: tried to create Proc object without a block
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Mar*_*llo 76

这是一个解析器问题.试试这个

named_scope :admin, (lambda do |company_id| 
  {:conditions => ['company_id = ?', company_id]}
end)
Run Code Online (Sandbox Code Playgroud)

  • khell:是的,我承认“问题”有点错误。正如迈克·伍德豪斯所解释的那样,这是一个 do...end 优先级较低的问题。 (2认同)

Mik*_*use 17

我认为问题可能与{...}和之间的优先级差异有关do...end

这里也有一些SO讨论这里

我认为将一个lambda分配给一个变量(可能是一个Proc)可以通过以下方式完成do ... end:

my_proc = lambda do 
  puts "did it"
end
my_proc.call #=> did it
Run Code Online (Sandbox Code Playgroud)


Kel*_*vin 9

如果您使用的是ruby 1.9或更高版本1,则可以使用lambda文字(箭头语法),它具有足够高的优先级,以防止方法调用从lambda"窃取"块.

named_scope :admin, ->(company_id) do 
  {:conditions => ['company_id = ?', company_id]}
end
Run Code Online (Sandbox Code Playgroud)

1第一个稳定的Ruby 1.9.1版本是2009-01-30.


khe*_*lll 7

正如我所知,它与优先权有关

1.upto 3 do # No parentheses, block delimited with do/end
  |x| puts x 
end

1.upto 3 {|x| puts x } # Syntax Error: trying to pass a block to 3!
Run Code Online (Sandbox Code Playgroud)