В Ruby, если «global_variables.class» возвращает «Array», как определить, является ли global_variables массивом или методом? - PullRequest
4 голосов
/ 24 июня 2010

В Ruby, если global_variables.class возвращает Array, как определить, является ли global_variables массивом или методом?

Ответы [ 3 ]

7 голосов
/ 24 июня 2010

Копайте это:

>> global_variables
=> ["$-l", "$LOADED_FEATURES", "$?", ... , "$SAFE", "$!"]
>> method(:global_variables)
=> #<Method: Object(Kernel)#global_variables>

Для сравнения:

>> method(:foo)
NameError: undefined method `foo' for class `Object'
    from (irb):6:in `method'
    from (irb):6
>> 
0 голосов
/ 24 июня 2010

Когда Ruby видит голое слово, он всегда сначала проверяет, есть ли локальная переменная с таким именем. Если нет, он пытается вызвать метод:

>> def foo
..   "bar"
..   end
=> nil
>> foo = "lala"
=> "lala"
>> foo
=> "lala"
>> # to explicitly call the method
..   foo()
=> "bar"

Если он не может разрешить имя как локальный var или метод, вы получите следующую ошибку:

>> bar
NameError: undefined local variable or method `bar' for #<Object:0x000001008b8e58>
    from (irb):1

Поскольку вы ранее не присваивали глобальные переменные, это должен быть метод.

0 голосов
/ 24 июня 2010

Обычно глобальные методы определяются Kernel, который является предком Object.Все методы, написанные вне класса, рассматриваются как закрытые методы Object.

irb(main):031:0> Object.private_methods.select{|x| x.to_s.start_with? 'gl'}
=> [:global_variables]

irb(main):032:0> f = [1,2,3]
=> [1, 2, 3]
irb(main):033:0> f.class
=> Array
irb(main):037:0> Object.private_methods.select{|x| x.to_s.start_with? 'f'}
=> [:format, :fail, :fork]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...