我想创建一个具有私有类方法的类。我希望可以在实例方法内使用此私有类方法。在Ruby中,`&method(:method_ name)是什么意思?
以下是我第一次尝试:
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
。
这是预期的,因为调用与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
的内容?
奈斯利解释。 –
'&'**不会将'Method'实例作为一个块传递。它根本不会根据类型区分参数。它在接收方隐含地调用'to_proc'(在这种情况下为''Method''),并将结果('Proc'实例)传递给方法。 '::to_s'完全和':to_s'符号一样调用'Symbol#to_proc'并且进一步传递'Proc'。 – mudasobwa
我正在简化目的的解释。但我想我可以添加一些关于'to_proc'的解释...... –