可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I thought the following two were equivalent:
named_scope :admin, lambda { |company_id| {:conditions => ['company_id = ?', company_id]} } named_scope :admin, lambda do |company_id| {:conditions => ['company_id = ?', company_id]} end
but Ruby is complaining:
ArgumentError: tried to create Proc object without a block
Any ideas?
回答1:
it's a parser problem. try this
named_scope :admin, (lambda do |company_id| {:conditions => ['company_id = ?', company_id]} end)
回答2:
I think the problem may be related to the difference in precedence between {...}
and do...end
There's some SO discussion here
I think assigning a lambda to a variable (which would be a Proc) could be done with a do ... end
:
my_proc = lambda do puts "did it" end my_proc.call #=> did it
回答3:
It's something related to precedence as I can tell
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!
回答4:
If you're on ruby 1.9 or later 1, you can use the lambda literal (arrow syntax), which has high enough precedence to prevent the method call from "stealing" the block from the lambda.
named_scope :admin, ->(company_id) do {:conditions => ['company_id = ?', company_id]} end
1 The first stable Ruby 1.9.1 release was 2009-01-30.