send()在Ruby中做什么?

4ktjp1zp  于 2023-03-08  发布在  Ruby
关注(0)|答案(8)|浏览(157)

有没有人能告诉我下面这段

obj.send("#{method_name}")

现在和现在?

yrwegjxp

yrwegjxp1#

send向对象示例及其在类层次结构中的祖先发送消息,直到某个方法做出React(因为它的名称与第一个参数匹配)。
实际上,这些行是等价的:

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

注意,send绕过了可见性检查,因此您也可以调用私有方法(对单元测试很有用)。
如果send之前确实没有变量,则表示使用了全局Object:

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

omhiaaxx2#

  • send* 是一个Ruby方法,允许通过名称调用另一个方法,并向其传递任何指定的参数。
class Klass
   def hello(*args)
     "Hello " + args.join(' ')
   end
 end
 k = Klass.new
 k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"

来源

zphenhs4

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
du7egjpx

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
gpnt7bae

gpnt7bae5#

send的作用是什么?

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元编程的时候非常方便,因为这允许我们根据不同的需求调用不同的方法。

ukxgm1gy

ukxgm1gy6#

Send也可以用来显示Ruby中的所有内容都是对象

1.send(:+, 1)  ## -> 2
3.send(:*, 2)  ## -> 6
mnemlml8

mnemlml87#

视图的另一个使用案例:

<%= link_to 
    send("first_part_of_path_#{some_dynamic_parameters}_end_path", 
    attr1, attr2), ....
    %>

允许您编写可缩放视图,该视图使用以下对象处理所有类型的对象:

render 'your_view_path', object: "my_object"
ih99xse1

ih99xse18#

我对这个主题已经很晚了。作为一个新手,我只是使用它,并希望对像我这样想要简单答案的人有所帮助。filter_hash. each {|k、v|顺序附加散列[发送(方法名称,k)]= v}
如上所示,send(method_name)是我们要调用的方法,如果方法名是作为字符串传入的,并且k是我们要传入方法的参数,那么它匹配名称并调用方法。

相关问题