Почему модуль # define_method игнорирует метод именования "правил" - PullRequest
0 голосов
/ 20 мая 2018

Следующее не будет работать в качестве определения метода (если мы не определяем одноэлементный метод для the):

def the.dot
  :dot
end

Но с Module # define_method все работает нормально:

define_method('the.dot') { :dot }
#=> :"the.dot"
method('the.dot')
#=> #<Method: main.the.dot>

Вызов обычным способом вызовет исключение:

the.dot
#=> NameError: undefined local variable or method `the' for main:Object

Но есть способы вызвать этот метод:

method('the.dot').call
#=> :dot
public_send('the.dot')
#=> :dot

Почему define_method игнорирует правила именования методов, разрешая почти что-либо быть именем метода?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

define_method не игнорирует правила именования.Разрешенные define_method разрешены Ruby в первую очередь.Это просто тот случай, когда с ключевым словом def можно определять только ограниченные группы имен.

0 голосов
/ 20 мая 2018

define_method принимает символ в качестве первого аргумента.Если вы передадите ей строку, она преобразует эту строку в символ, который в этом случае выглядит действительно странно, как :"the.dot", но это символ, похожий на :thedot, но Ruby цитирует его, потому что в противном случае он нарушил бы синтаксис ruby.

> "the.dot".to_sym
=> :"the.dot"
> "thedot".to_sym
=> :thedot
> "the dot".to_sym
=> :"the dot"
> define_method("the dot") { "yep, this works" }
=> :"the dot"
> method("the dot").call
=> "yep, this works"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...