有人可以告诉我什么吗
send("#{Model.find...}")
是,现在呢?
有人可以告诉我什么吗
send("#{Model.find...}")
是,现在呢?
Answers:
send
在类层次结构中向对象实例及其祖先发送消息,直到某些方法做出反应(因为其名称与第一个参数匹配)。
实际上,这些行是等效的:
1.send '+', 2
1.+(2)
1 + 2
请注意,它send
绕过了可见性检查,因此您也可以调用私有方法(对于单元测试很有用)。
如果在发送之前确实没有任何变量,则意味着使用了全局对象:
send :to_s # "main"
send :class # Object
send是一个ruby(没有rails)方法,允许通过名称调用另一个方法。
从文档
class Klass
def hello(*args)
"Hello " + args.join(' ')
end
end
k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
我认为.send方法最有用的功能之一是它可以动态调用方法。这样可以节省很多打字时间。.send方法最流行的用途之一是动态分配属性。例如:
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")
但是可以全部替换为以下内容:
假设您的Rails应用需要根据用户输入为汽车类别分配属性,则可以
c = Car.new()
params.each do |key, value|
c.send("#{key}=", value)
end
另一个示例,类似于Antonio Jha的https://stackoverflow.com/a/26193804/1897857
是是否需要读取对象的属性。
例如,如果您有一个字符串数组,如果尝试遍历它们并在对象上调用它们,它将无法正常工作。
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.a
end
# => NoMethodError: undefined method `a'
但是,您可以send
将字符串添加到对象:
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.send(a)
end
# => Vandalay Project
# => A very important project
send
是调用方法的另一种方式。
最好通过示例说明:
o = Object.new
o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
# is equivalent to:
o.to_s # => "#<Object:0x00005614d7a24fa3>"
这种方法的好处是您可以将要调用的方法作为参数传入。这是一个简单的示例:
def dynamically_call_a_method(name)
o = Object.new
o.send name
end
dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"
您可以传入要调用的方法。在这种情况下,我们通过了:to_s
。在进行ruby元编程时,这可能非常方便,因为这允许我们根据我们的不同要求调用不同的方法。
视图的另一个用例:
<%= link_to
send("first_part_of_path_#{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
允许。您将编写可伸缩视图,该视图可与以下各种对象一起使用:
render 'your_view_path', object: "my_object"