有没有人能告诉我下面这段
obj.send("#{method_name}")
现在和现在?
yrwegjxp1#
send向对象示例及其在类层次结构中的祖先发送消息,直到某个方法做出React(因为它的名称与第一个参数匹配)。实际上,这些行是等价的:
send
1.send '+', 2 1.+(2) 1 + 2
注意,send绕过了可见性检查,因此您也可以调用私有方法(对单元测试很有用)。如果send之前确实没有变量,则表示使用了全局Object:
send :to_s # "main" send :class # Object
omhiaaxx2#
class Klass def hello(*args) "Hello " + args.join(' ') end end k = Klass.new k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
来源
zphenhs43#
我认为.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
du7egjpx4#
另一个示例类似于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
gpnt7bae5#
send是“调用方法”的另一种方式。示例:
o = Object.new o.to_s # => "#<Object:0x00005614d7a24fa3>" # is equivalent to: o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
Send存在于Object类中。
这种方法的好处是你可以把你想调用的方法作为一个参数传入。下面是一个简单的例子:
def dynamically_call_a_method(method_name) o = Object.new o.send method_name end dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"
你可以传入你想被调用的方法,在这个例子中我们传入了:to_s,这在做ruby元编程的时候非常方便,因为这允许我们根据不同的需求调用不同的方法。
:to_s
ukxgm1gy6#
Send也可以用来显示Ruby中的所有内容都是对象
1.send(:+, 1) ## -> 2 3.send(:*, 2) ## -> 6
mnemlml87#
视图的另一个使用案例:
<%= link_to send("first_part_of_path_#{some_dynamic_parameters}_end_path", attr1, attr2), .... %>
允许您编写可缩放视图,该视图使用以下对象处理所有类型的对象:
render 'your_view_path', object: "my_object"
ih99xse18#
我对这个主题已经很晚了。作为一个新手,我只是使用它,并希望对像我这样想要简单答案的人有所帮助。filter_hash. each {|k、v|顺序附加散列[发送(方法名称,k)]= v}如上所示,send(method_name)是我们要调用的方法,如果方法名是作为字符串传入的,并且k是我们要传入方法的参数,那么它匹配名称并调用方法。
8条答案
按热度按时间yrwegjxp1#
send
向对象示例及其在类层次结构中的祖先发送消息,直到某个方法做出React(因为它的名称与第一个参数匹配)。实际上,这些行是等价的:
注意,
send
绕过了可见性检查,因此您也可以调用私有方法(对单元测试很有用)。如果send之前确实没有变量,则表示使用了全局Object:
omhiaaxx2#
来源
zphenhs43#
我认为.send方法最有用的特性之一是它可以动态地调用方法。这可以保存你大量的输入。.send方法最流行的用法之一是动态地分配属性。例如:
要定期分配属性,需要
或使用.send方法:
但它都可以用以下内容来替换:
假设您的Rails应用程序需要根据用户输入为汽车类分配属性,您可以
du7egjpx4#
另一个示例类似于Antonio Jha的https://stackoverflow.com/a/26193804/1897857
就是你需要读取一个对象的属性
例如,如果你有一个字符串数组,如果你试图遍历它们并在你的对象上调用它们,它将不会起作用。
但是,您可以将字符串
send
到对象:gpnt7bae5#
send的作用是什么?
send
是“调用方法”的另一种方式。示例:Send存在于Object类中。
这有什么好处?
这种方法的好处是你可以把你想调用的方法作为一个参数传入。下面是一个简单的例子:
你可以传入你想被调用的方法,在这个例子中我们传入了
:to_s
,这在做ruby元编程的时候非常方便,因为这允许我们根据不同的需求调用不同的方法。ukxgm1gy6#
Send也可以用来显示Ruby中的所有内容都是对象
mnemlml87#
视图的另一个使用案例:
允许您编写可缩放视图,该视图使用以下对象处理所有类型的对象:
ih99xse18#
我对这个主题已经很晚了。作为一个新手,我只是使用它,并希望对像我这样想要简单答案的人有所帮助。filter_hash. each {|k、v|顺序附加散列[发送(方法名称,k)]= v}
如上所示,send(method_name)是我们要调用的方法,如果方法名是作为字符串传入的,并且k是我们要传入方法的参数,那么它匹配名称并调用方法。