ruby-on-rails - 如何像 Trailblazer 一样使 ruby 类可调用?
问题描述
如何#execute
通过下一个语法编写可以使用括号自动调用的类,例如方法(例如,通过内部调用):
MyModule::Class.(*params)
或
MyModule::Class(*params)
?
解决方案
试一试很容易,因为 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 告诉我们我们需要一个Class
在MyModule
.
您只是调用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}]
推荐阅读
- java - 将“while”循环转换为“for”和“do while”
- ios - Twilio caller name on receive programmable voice call in ios application
- c++ - 检查数组的2个元素
- php - 无法在弹出式联系表单中输入内容
- java - 无法构建我的应用
- java - 在java中添加两个char数据类型
- c - 移动数据块——memcpy 还是 memmove?
- javascript - 用于重用的 Javascript 字符串模板
- ios - 如何使 Alamofire 中的会话无效?
- javascript - Nuxt.js 开发脚本失败