send()在Ruby中做什么?

有人可以告诉我什么

send("#{Model.find...}") 

是,是吗?

发送一个消息到一个对象实例及其祖先的类层次结构中,直到某个方法作出反应(因为它的名字与第一个参数相匹配)。

实际上,这些线是相同的:

 1.send '+', 2 1.+(2) 1 + 2 

请注意, send绕过可见性检查,以便您也可以调用私有方法(对unit testing有用)。


如果发送之前确实没有variables,则表示使用全局对象:

 send :to_s # "main" send :class # Object 

发送是一个ruby(没有导轨)的方法,允许通过名称调用另一种方法。

从文档

  class Klass def hello(*args) "Hello " + args.join(' ') end end k = Klass.new k.send :hello, "gentle", "readers" #=> "Hello gentle readers" 

http://corelib.rubyonrails.org/classes/Object.html#M001077

我认为使用.send方法最有用的function之一是它可以dynamic调用方法。 这可以为您节省很多打字。 .send方法最stream行的用法之一是dynamic分配属性。 例如:

 class Car attr_accessor :make, :model, :year end 

定期分配属性需要

 c = Car.new c.make="Honda" c.model="CRV" c.year="2014" 

或者使用.send方法:

 c.send("make=", "Honda") c.send("model=", "CRV") c.send("year=","2014") 

但它可以全部replace为以下内容:

假设你的Rails应用程序需要从用户input中为你的汽车类指定属性,你可以这样做

 c = Car.new() params.each do |key, value| c.send("#{key}=", value) end 

另一个例子,类似于安东尼奥Jha的https://stackoverflow.com/a/26193804/1897857

是否需要读取对象的属性。

例如,如果你有一个string数组,如果你尝试迭代它们并在你的对象上调用它们,它将不起作用。

 atts = ['name', 'description'] @project = Project.first atts.each do |a| puts @project.a end # => NoMethodError: undefined method `a' 

但是,您可以sendstringsend给对象:

 atts = ['name', 'description'] @project = Project.first atts.each do |a| puts @project.send(a) end # => Vandalay Project # => A very important project