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"
我认为使用.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'
但是,您可以send
stringsend
给对象:
atts = ['name', 'description'] @project = Project.first atts.each do |a| puts @project.send(a) end # => Vandalay Project # => A very important project