2016-09-06 4 views
2

Что мои знания говорят о Ruby, так это то, что частные методы нельзя вызывать с явным приемником даже self.Частные методы вызова в Ruby

class Private 
    private 
    def private_method(c) 
    puts '#{c}' 
    end 
end 

p = Private.new 
p.instance_eval{ private_method("private method called") } 

Как это работает? Мы можем вызвать частный метод с instance_eval. Пожалуйста, объясните

+3

Вы не видите здесь явный приемник, не так ли? –

+1

Я смущен на ваш вопрос. Вы говорите, что частные методы могут быть вызваны без явного приемника. Вы вызываете частный метод без явного приемника. Тогда вы удивлены тем, что вы можете вызвать частный метод без явного приемника? –

ответ

1

Поскольку instance_eval выполняет блок в контексте p (а значит, это self) и призыв к private_method теперь вызов с неявным приемником.

1

Ruby позволяет делать много «неприятных» вещей, которые разрушают инкапсуляцию или любой другой принцип.

instance_eval управляет блоком с self, являющимся p. И вы можете, очевидно, вызвать частные методы, когда находитесь в этом экземпляре. Вы даже можете определить методы таким образом!

class A 
end 
a = A.new 
a.instance_eval{def value; 5; end} 
puts a.value # prints "5" 

Это не единственный способ сделать это. send также разрешено для личных процедур:

class A 
    private 
    def p 
    5 
    end 
end 
a = A.new 
puts a.send(:p) # prints "5" 
+1

Да, с рубином вы можете нарушить все принципы. Ничто не священно. :) –

+0

Я думаю, что 'send' не должен иметь доступа к приватным методам. Все можно вызвать с помощью отправки! – mhaseeb

+0

@mhaseeb: взгляните на 'public_send'. –

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