Когда вы говорите, что Ruby является рефлексивным, относится ли это в основном к «типизированию утки»? - PullRequest
4 голосов
/ 13 февраля 2009

Я читал текст, описывающий Ruby, и он сказал следующее:

Рубин считается «отражающим» язык, потому что это возможно для Ruby программа для анализа себя (в сроки его макияжа), сделать корректировки, как это работает, и даже переписать свой собственный код с другим Код.

Меня смущает этот термин «рефлексивный» - это в основном говорит о том, как Руби может посмотреть на переменную и выяснить, является ли она целым или строковым (типизацией утки), например:

x = 3
x = "three" # Ruby reassigns x to a String type

Ответы [ 4 ]

9 голосов
/ 13 февраля 2009

Сказать, что Ruby является "отражающим", означает, что вы можете, например, выяснить во время выполнения, какие методы у класса:

>> Array.methods
=> ["inspect", "private_class_method", "const_missing",
[ ... and many more ... ]

(Вы можете сделать то же самое с объектом класса.)

Или вы можете узнать, к какому классу относится данный объект ...

>> arr = Array.new
=> []
>> arr.class
=> Array

И выясните, что внутри иерархии классов ...

>> arr.kind_of?
>> arr.kind_of? Array
=> true
>> arr.kind_of? String
=> false

В цитате, где говорится, что "программа Ruby может анализировать себя", это то, о чем они говорят.

Другие языки, такие как Java, тоже делают это, но с Ruby это проще, удобнее и более повседневной частью использования языка. Следовательно, Руби "рефлексивен".

2 голосов
/ 13 февраля 2009

Нет, это означает, что вы можете выполнить команду ruby, чтобы получить информацию о чем угодно. Например, вы можете ввести команду File.methods (), чтобы получить список всех методов, принадлежащих модулю File. Вы можете делать аналогичные вещи с классами и объектами - перечислять методы, переменные и т. Д.

1 голос
/ 13 февраля 2009

Открытие класса является хорошим примером этого. Вот простой пример:

class Integer
    def moxy
        if self.zero?
            self - 2
        elsif self.nonzero?
            self + 2          
        end      
    end  
end

puts 10.moxy

Повторно открыв стандартный класс Ruby - Integer - и определив в нем новый метод с именем «moxy», мы можем выполнить вновь определенную операцию непосредственно над числом. В этом случае я определил этот составленный метод 'moxy', чтобы вычесть 2 из целого числа, если оно равно нулю, и добавить два, если оно не равно нулю. Это делает метод moxy доступным для всех объектов класса Integer в Ruby. (Здесь мы используем ключевое слово «self» для получения содержимого целочисленного объекта).

Как видите, это очень мощная функция Ruby.

РЕДАКТИРОВАТЬ: Некоторые комментаторы спрашивали, действительно ли это отражение . В английском языке слово отражение относится к изучению ваших собственных мыслей. И это, безусловно, важный аспект рефлексии в программировании - использование методов Ruby, таких как is_a, kind_of, instance_of, для выполнения самопроверки во время выполнения. Но рефлексия также относится к способности программы изменять свое поведение во время выполнения. Повторное открытие классов является одним из ключевых примеров этого. Это также называется исправление обезьяны . Это не без рисков, но все, что я делаю, это описываю это здесь в контексте размышлений, примером которых является

0 голосов
/ 13 февраля 2009

Это относится главным образом к тому, насколько легко проверять и изменять внутренние представления во время выполнения в программах Ruby, таких как классы, константы, методы и т. Д.

Большинство современных языков предлагают какие-то отражающие возможности (даже статически типизированные, такие как Java), но в Ruby эти возможности настолько просты и естественны, что они действительно имеют значение, когда они вам нужны.

Это просто делает метапрограммирование, например, почти тривиальной задачей, что совсем не так в других языках, даже в динамических.

...