首页 > 解决方案 > 如何像 Trailblazer 一样使 ruby​​ 类可调用?

问题描述

如何#execute通过下一个语法编写可以使用括号自动调用的类,例如方法(例如,通过内部调用): MyModule::Class.(*params)MyModule::Class(*params)

标签: ruby-on-railsruby

解决方案


试一试很容易,因为 Ruby 会直接告诉你需要做什么

你说你想写MyModule::Class.(*params),所以你只是这样

MyModule::Class.(*params)

Ruby 会告诉您缺少什么:

NoMethodError (undefined method `call' for MyModule::Class:Class)

因此,如您所见,Ruby 告诉我们缺少一个call在 的单例类中命名的方法MyModule::Class,所以让我们定义该方法:

module MyModule
  def Class.call(*params)
    puts "Method `#{__callee__}` called with params #{params.inspect}"
  end
end

MyModule::Class.(1, 'two', :three, [[], [], [], []], { five: :six })
# Method `call` called with params [1, "two", :three, [[], [], [], []], {:five=>:six}]

所以,这里的秘诀foo.(bar, baz)就是foo.call(bar, baz).

对于第二个例子,我们可以做同样的事情:

MyModule::Class(*params)

然后再次:

NoMethodError (undefined method `Class' for MyModule:Module)

因此,在这种情况下,Ruby 告诉我们我们需要一个ClassMyModule.

您只是调用Class对象上命名的方法MyModule。事实上,它和你写的完全一样MyModule.Class(*params)

def MyModule.Class(*params)
  puts "Method `#{__callee__}` called with params #{params.inspect}"
end

MyModule::Class(1, 'two', :three, [[], [], [], []], { five: :six })
# Method Class called with params [1, "two", :three, [[], [], [], []], {:five=>:six}]

推荐阅读