我想創建一個具有私有類方法的類。我希望可以在實例方法內使用此私有類方法。在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'的解釋...... –