2015-02-10 4 views
0

Я хочу определить метод singleton, но он должен быть закрытым. Лучшее, что я могу придумать ниже:Как определить частный define_singleton_method без использования `send`?

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

Есть ли способ без использования send сделать это?

+0

я не получил то, что вы хотите? Вы пытаетесь определить * private singleton method *? –

+0

Да, я хочу определить метод для текущего объекта и для него быть закрытым. – Kris

+0

По умолчанию методы singleton являются частными. Я имел в виду, что никто не может назвать это, кроме объекта, на котором вы его определили. –

ответ

0

я проглядел class_eval:

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

В общем, вам следует избегать использования любого из 'eval', если вам удастся избежать менее интрузивных методов отражения, таких как 'send',' instance_variable_get'/'_set' и т. Д. –

+0

' eval * 'получает плохое репутация, но на самом деле это всего лишь проблема, афайк, если включать пользовательский ввод или по соображениям производительности. В этом случае я считаю это законным. – Kris

+0

Это также излишне, поскольку его возможности (оценка произвольного кода) просто не нужны. Обычного 'send' достаточно. –

Смежные вопросы