命名范围(或Rails 4中的范围),Lambdas和Procs之间的确切区别是什么?
在Lambda和Proc之间,选择哪一个?
答案 0 :(得分:7)
<强> 1。 Proc不检查传递的参数,但lambda
proc1 = Proc.new { |a, b| a + 5 }
proc1.call(2) # call with only one parameter
=> 7 # no error, unless the block uses the 2nd parameter
lambda1 = lambda { |a, b| a + 5 }
lambda1.call(2)
=> ArgumentError: wrong number of arguments (1 for 2)
仅当块使用第二个参数时,Proc才会抛出错误。
proc2 = Proc.new { |a, b| a + b }
proc2.call(2) # call with only one parameter
=> TypeError: nil can't be coerced into Fixnum
<强> 2。 Proc从调用方法返回,而lambda不
def meth1
Proc.new { return 'return from proc' }.call
return 'return from method'
end
puts meth1
=> return from proc
def meth2
lambda { return 'return from lambda' }.call
return 'return from method'
end
puts meth2
=> return from method
如果没有在方法中调用它们,
proc1 = Proc.new { return "Thank you" }
proc1.call
=> LocalJumpError: unexpected return
lambda1 = lambda { return "Thank you" }
lambda1.call
=> "Thank you"
第3。范围/命名范围是Rails
它用于指定常用查询,这些查询可以作为关联对象或模型上的方法调用进行引用
例如,在user.rb中:
scope :developers, -> { where(:role => 'developer') }
您可以将其用作
@developers = User.developers
范围是可链接的,因此您可以执行
等查询@developers = User.developers.where(:age => 40)
示例中定义的范围与定义类方法完全相同,如下所示。
def self.developers
where(:role => 'developer')
end