gpt4 book ai didi

ruby-on-rails - 命名作用域、Lambdas 和 Procs 之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:09 24 4
gpt4 key购买 nike

命名作用域(或 Rails 4 中的作用域)、Lambdas 和 Procs 之间的确切区别是什么?

Lambda 和 Proc,该选哪个?

最佳答案

<强>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)

只有当 block 使用第二个参数时,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

关于ruby-on-rails - 命名作用域、Lambdas 和 Procs 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21373453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com