【发布时间】:2017-07-10 13:33:32
【问题描述】:
我试图创建一个具有私有类方法的类。我希望这个私有类方法可以在实例方法中使用。
以下是我的第一次尝试:
class Animal
class << self
def public_class_greeter(name)
private_class_greeter(name)
end
private
def private_class_greeter(name)
puts "#{name} greets private class method"
end
end
def public_instance_greeter(name)
self.class.private_class_greeter(name)
end
end
Animal.public_class_greeter('John') 工作正常,打印John greets private class method。
但是,Animal.new.public_instance_greeter("John") 会引发错误:NoMethodError: private method 'private_class_greeter' called for Animal:Class。
这是意料之中的,因为调用self.class.private_class_greeter 与Animal.private_class_greeter 相同,显然会引发错误。
在搜索了如何解决这个问题之后,我想出了以下代码,它可以完成这项工作:
class Animal
class << self
def public_class_greeter(name)
private_class_greeter(name)
end
private
def private_class_greeter(name)
puts "#{name} greets private class method"
end
end
define_method :public_instance_greeter, &method(:private_class_greeter)
end
我不太明白这里发生了什么:&method(:private_class_greeter)。
你能解释一下这是什么意思吗?
如果我要替换:
define_method :public_instance_greeter, &method(:private_class_greeter)
与:
def public_instance_greeter
XYZ
end
那么,XYZ 的内容应该是什么?
【问题讨论】:
标签: ruby metaprogramming