我想构造一个具有以下属性的Ruby对象:对于任何方法名称,当该方法名称传递给对象时,返回值是方法名称作为字符串。
这是一个有一些问题的尝试:
class Echo < BasicObject
def self.method_missing(the_method)
the_method.to_s
end
end
Echo
根据需要响应大多数方法调用:
> Echo.foo
=> "foo"
> Echo.send("Hello world.")
=> "Hello world."
但Echo
继承自BasicObject
,因此它以正常方式响应其超类'方法:
> Echo.to_s
=> "Echo"
如何构造一个总是回显它传递的消息的对象。 (如果解决方案在每次调用时都不需要复杂的方法查找,则会获得奖励。)
答案 0 :(得分:1)
怎么样:
class Echo
class << self
def method_missing(the_method)
the_method.to_s
end
methods.each do |name|
define_method(name) do |*any|
name.to_s
end
end
end
end
试验:
RSpec.describe Echo do
it "returns a missing method as a string" do
expect(described_class.some_method_that_doesnt_exist).
to eq("some_method_that_doesnt_exist")
end
it "returns an existing method as a string" do
expect(described_class.to_s).
to eq("to_s")
end
end