带有散列参数的 Ruby public_send 方法(如果适用)

标签 ruby methods

Tldr:我正在尝试使用 public_send 来调用方法,但其中一些方法也需要参数。如何检查哪些需要参数并将它们添加为参数并将它们包含在调用中

我在这样的类中有一组方法
class_methods = [:first, :second, :third, :fourth] ...

我定义了一个 can_execute 方法来检查类是否有该方法,如果有则执行。

def can_execute (class, method_name)
  if class.respond_to?(method_name.to_sym) && class.class_methods.include?(method_name.to_sym)
    class.public_send(method_name)
  end
end

当用户提供这些 class_method 中的任何一个作为参数时,我可以这样调用它们
can_execute(类,方法名)

问题是其中一些方法接受散列作为参数,比如
class.first(Value: true)
class.second(Id: 0, Value: "string")

但有些人没有
class.third

我不确定如何包含这些 class_methods 要求的参数散列?

我确实可以选择通过调用它们来检查这些方法需要哪些参数,method_args,比如

class.method_args(:first)
-> [:Value]

class.method_args(:second)
=> [:Id, :Value]

class.method_args(:third)
=> []

最佳答案

您需要将参数传递给 can_execute,以便它可以将它们传递给 public_send。 splat 运算符是您的 friend 。当用作参数时,它会将任意数量的参数用它的名称包装到一个数组中。在数组上使用时,它将数组分解为要传递给方法的参数。

除此之外,class 是一个关键字。约定是称它为 klass,但它可以是任何你想要的(类除外)

考虑到这一点,我们的新方法如下所示:

def can_execute (klass, method_name, *args)
  if klass.respond_to?(method_name.to_sym) && klass.class_methods.include?(method_name.to_sym)
    klass.public_send(method_name, *args)
  end
end

然后调用,可以带参数也可以不带参数。无需先检查:

can_execute('teststring', :slice, 1, 5) # => "ests"
can_execute('teststring', :upcase) # => "TESTSTRING"

如果你有其他原因想要检查参数,你可以使用 Method#arityMethod#parameters . #slice

的结果类似这样
klass.method(method_name.to_sym).arity # => -1
klass.method(method_name.to_sym).parameters # => [[:rest]]

关于带有散列参数的 Ruby public_send 方法(如果适用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50700980/

相关文章:

ruby - LoadError : cannot load such file -- gherkin/formatter/json_formatter , 运行命令 rackup,ruby 版本 2.2.0 和 cucumber 2.1.0

Ruby 排序和消除重复项

Groovy 中的动态方法调用

java - 从java中的方法返回值时出错

ruby - 从字符串中删除第一个字符的最简单方法是什么?

ruby-on-rails - Twitter Streaming API 的 Rails gem

ruby-on-rails - 调整 ruby gem 以进行代码阅读的最佳方法是什么

ruby - 如何将变量更改为符号?

android - 检查 editText 数组是否为空

java - 链接方法调用java性能