Почему называется 'is_a?Объект 'в методе возвращает' true '? - PullRequest
0 голосов
/ 27 сентября 2018

Рубиновым методом является Object.Например:

def method
  'does something'
end
method.is_a? Object #=> true

def method; end 
method.is_a? Object #=> true

Почему метод a Object?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Как писал Илья Конюхов, при вызове method.is_a?(Object) проверяется возвращаемое значение при вызове method, которое будет "does something" и nil соответственно - оба значения равны Object с.

Методы Rubys не являются объектами как таковыми , но вы можете получить представление объектов из них, используя метод Object#method.

Забавная часть вашего конкретного примера состоит в том, что вы, к сожалению, назвали свой метод тестирования «метод», перезаписав таким образом ваш метод self s method.

Взгляните на этот пример, где я назвалвместо этого мой метод "test":

def test; end

test.class.name          => "NilClass"

method(:test).class.name => "Method"

Как видите, test - это , вызывающий метод и все после (например, is_a? или class.name) вызывается на возвращаемое значение .

method(:test), однако, возвращает представление объекта (класса Method) самого метода.

0 голосов
/ 27 сентября 2018

«Методы Ruby не являются объектами в том виде, в котором они представляют собой строки, числа и массивы» (The Ruby Programming Language, Flanagan and Matsumoto, стр. 176).Название метода OP "method" неудачно;это делает почти невозможным объяснить что-либо.Если вам нужно обработать метод как объект, есть метод метода , который приводит к экземпляру метода класса .

0 голосов
/ 27 сентября 2018

method.is_a?(Object)

можно переписать как

res = method
res.is_a?(Object)

Таким образом, вы вызываете метод и спрашиваете, является ли его результат - экземпляр String - Object.Конечно, это так.

Это можно легко проверить с помощью:

method.is_a?(String) # also returns true

Обновление :

Если вы хотите проверить, если сам методObject или нет, вы можете сделать это с помощью следующего фрагмента кода:

def method2
  "some string"
end

method2_ref = Object.method(:method2) # #<Method: Object.method2>
method2_ref.is_a? Object # true
method2_ref.is_a? String # false

Как уже упоминалось в комментариях, экземпляр Method также является Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...