2015-02-10 20 views
0

我想定義一個單例方法,但它需要是私有的。我能想出的最好的是如下:如何在不使用`send`的情況下定義一個私有的define_singleton_method?

def initialize 
    define_singleton_method(name) { ... } 
    self.singleton_class.send(:private, name) 
end 

有,而不必使用send做到這一點的方法嗎?

+0

我沒有得到你想要什麼?你想要定義一個*私有單例方法*嗎? – 2015-02-10 11:36:32

+0

是的,我想在當前對象上定義一個方法,並且它是私有的。 – Kris 2015-02-10 12:48:55

+0

默認情況下,單例方法是私有的。我的意思是沒有人可以稱它爲你定義它的對象。 – 2015-02-10 12:57:18

回答

0

我忽略class_eval

define_singleton_method(name) { ... } 
self.singleton_class.class_eval { private name } 
+0

一般來說,如果你可以避免使用任何'eval's,如果你可以用較少侵入性的反射方法如'send','instance_variable_get' /'_set'等等來逃脫。 – 2015-02-10 12:55:23

+0

'eval *'得到一個糟糕的代表,但它真的只是一個問題,afaik,如果包括用戶輸入或性能原因。在這種情況下,我認爲這是合法的。 – Kris 2017-06-20 14:16:10

+0

因爲它的功能(評估任意代碼)根本不需要,所以它也是過度的。普通的'send'就足夠了。 – 2017-06-20 18:37:38

相關問題