Ruby 中的 send 方法

Stewart Nguyen 2023年1月30日
  1. 在 Ruby 中调用没有 send 方法的方法
  2. 在 Ruby 中使用 send 方法调用私有方法
  3. 在 Ruby 中使用 send 方法在运行时调用方法
Ruby 中的 send 方法

在 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_xmlformat_plain_text

我们还有一个名为 get report_format 的方法,它返回 Report 支持的格式。

我们不能使用 . 直接调用 format_xml 的符号。相反,我们必须使用 send 函数:report.send(report format)

相关文章 - Ruby Method