Ruby 中的 send 方法
Stewart Nguyen
2023年1月30日
2022年5月18日
在 Ruby 中,有几种方法可以调用方法。本文将讨论 send
方法的使用及其好处。
在 Ruby 中调用没有 send
方法的方法
通常,我们会使用 .
跟在方法名后面来调用一个对象的方法。
考虑以下示例:
[1, 2, 3].join
=> "123"
在上面的代码片段中,对数组 [1, 2, 3]
调用了 join
方法。使用 .
仅适用于对象的公共方法;调用私有方法是不可能的。
在 Ruby 中使用 send
方法调用私有方法
要调用私有方法,请使用 send
方法。考虑以下代码片段。
class Foo
private
def secret
'secret that should not be told'
end
def my_asset(amount, location)
"I have #{amount}$ in #{location}"
end
end
Foo.new.secret
Foo.new.my_asset(100, 'the basement')
输出:
NoMethodError: private method 'secret' called for #<Foo>
NoMethodError: private method 'my_asset' called for #<Foo>
我们必须使用 send
方法来调用 private
关键字下定义的方法。
Foo.new.send(:secret)
Foo.new.send(:my_asset, 100, 'the basement')
输出:
=> "secret that should not be told"
=> "I have 100$ in bank"
send
方法的第一个参数是方法名称,可以是字符串或符号。origin 方法的参数也通过第二个和第三个参数接受,依此类推。
在 Ruby 中使用 send
方法在运行时调用方法
当有存储方法名称的变量时,send
会派上用场。
例子:
class Report
def format_xml
'XML'
end
def format_plain_text
'PLAIN TEXT'
end
end
def get_report_format(extension)
if extension == 'xml'
'format_xml'
else
'format_plain_text'
end
end
report_format = get_report_format('xml')
report = Report.new
formated_report = report.send(report_format)
输出:
"XML"
Report
类负责生成上例中的格式。它支持 format_xml
和 format_plain_text
。
我们还有一个名为 get report_format
的方法,它返回 Report
支持的格式。
我们不能使用 .
直接调用 format_xml
的符号。相反,我们必须使用 send
函数:report.send(report format)
。