命名范围,Lambdas和Procs之间的差异

时间:2014-01-27 05:13:30

标签: ruby-on-rails ruby ruby-on-rails-4

命名范围(或Rails 4中的范围),Lambdas和Procs之间的确切区别是什么?

在Lambda和Proc之间,选择哪一个?

1 个答案:

答案 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