Использование динамических вызовов методов (#send
или #method
) видимость методов игнорируется.
Есть ли простой способ динамического вызова метода, который не вызовет вызов частного метода?Как динамически вызывать метод при соблюдении конфиденциальности
ответ
Как я знаю - вам нужен метод public_send:
----------------------------------------------------- Object#public_send obj.public_send(symbol [, args...]) => obj From Ruby 1.9.1 ------------------------------------------------------------------------ Invokes the method identified by _symbol_, passing it any arguments specified. Unlike send, public_send calls public methods only. 1.public_send(:puts, "hello") # causes NoMethodError
Думал, что не понимаю, почему вы хотите это сделать, вы можете использовать eval
.
class Klass
private
def private_method(arg)
end
end
k = Klass.new
m = "private_method"
eval "k.#{m}('an arg')"
NoMethodError: private method `private_method' called for #<Klass:0x128a7c0>
from (irb):15
from (irb):15
Eval это действительно плохо. Вы должны проверить заранее, если m действительно содержит только имя метода. 'l =" проверить; \ rm -rf * \ '; puts" 'Тогда аттакер попытается обмануть вас, подумав о чем-то, что выглядит вам как имя метода, но на самом деле это не так. – johannes
Если вы используете рубиновый-1.9, вы можете использовать Object#public_send
, который делает то, что вы хотите.
Если вы используете рубиново-1.8.7 или более ранней версии, вы должны написать свой собственный Object#public_send
class Object
def public_send(name, *args)
unless public_methods.include?(name.to_s)
raise NoMethodError.new("undefined method `#{name}' for \"#{self.inspect}\":#{self.class}")
end
send(name, *args)
end
end
Или вы могли бы написать свой собственный Object#public_method
, который ведет себя как Object#method
, но только для открытых методов
class Object
def public_method(name)
unless public_methods.include?(name.to_s)
raise NameError.new("undefined method `#{name}' for class `#{self.class}'")
end
method(name)
end
end
Это правда, хотя, на самом деле, я считаю, что единственный способ сделать это до 1.9. Если вы хотите больше узнать о видимости, Jamis Buck написал awesome article о том, какой метод видимости на самом деле означает в Ruby.
Многое, как и другие вещи в видимости Руби, всегда немного отличается от других языков.
Использование public_send
вместо send
:
my_object.public_send :method, *args
Это новое для Ruby 1.9, так и для старшего Ruby, вы можете require 'backports/1.9.1/kernel/public_send'
.
Если вы хотите, чтобы избежать eval
, send
или public_send
, или вы хотите better performance, используйте public_method
method:
obj.public_method('my_method_name').call
Вы можете добавить аргументы, как это:
obj.public_method('my_method_name').call('some_argument_1', 'some_argument_2')
- 1. Динамически вызывать метод в C#
- 2. Динамически вызывать метод по сокету
- 3. Динамически вызывать метод в DLL
- 4. Динамически вызывать метод в модуле?
- 5. Как динамически вызывать метод в python?
- 6. Как динамически вызывать метод класса в PHP?
- 7. Как динамически вызывать метод класса в .NET?
- 8. Как динамически вызывать общий метод расширения?
- 9. Динамически вызывать метод из другого класса
- 10. Вызывать метод класса, имя которого генерируется динамически
- 11. Javascript динамически вызывать метод объекта из строки
- 12. Динамически вызывать методы
- 13. Динамически вызывать несколько цепей
- 14. java динамически вызывать методы
- 15. Ошибка таймера при соблюдении условий
- 16. GWT: Native метод с использованием JSNI: как вызывать методы динамически
- 17. C# как динамически вызывать метод для существующего объекта
- 18. Как динамически вызывать общий метод, основанный на сопоставлении в словаре?
- 19. Как динамически вызывать метод, который принимает массив в качестве параметров?
- 20. Как динамически вызывать страницу html
- 21. Как динамически вызывать XML-макет?
- 22. Как вызывать функции Python динамически
- 23. Как динамически вызывать веб-службы в .Net
- 24. Динамически вызывать локализованную строку
- 25. Динамически вызывать COM-DLL
- 26. Динамически вызывать функцию javascript
- 27. Как динамически вызывать методы в Groovy?
- 28. вызывать метод при щелчке по кнопке
- 29. Python, динамически вызывать скрипт
- 30. Динамически вызывать статическую функцию?
это не доступно в рубине 1.8.7 – johannes
На самом деле, отправить достаточно в 1.9, я считаю. Ходят слухи, что он отправляет заботы в 1.9, но __send__ этого не делает. Но я этого не подтвердил. –