Не получить точечный рубиновый оператор с точкой

#ruby

Вопрос:

Я знаком с оператором Ruby, его рабочим процессом и вариантами использования, но в месте, с которым я путаюсь . в выражении лица.

3.**2 1 дает результат 27

вместо 3.**2 этого дает 9 и

3**2 1 дает 10 , это нормально, но я запутался в 3.**2 1

все, чего мне не хватает с дот . оператор здесь.

Заранее спасибо!

Ответ №1:

Операторы в ruby поддерживаются методами. Так 3 ** 2 что функционально эквивалентно «вызовите метод ** 3 и передайте 2 в качестве аргумента».

Вы также можете напрямую вызывать эти методы ( 1. (2) вместо 1 2 ), что и делает эта точка в данном случае. И поскольку операторы имеют другой приоритет, чем вызовы методов, вы видите эти разные результаты.

 3.** 2   1 == 3.**(2 1)
# but
3 ** 2   1 == (3 ** 2)   1
 

Комментарии:

1. Интересный. Таким образом, добавление точки делает ее стандартной цепочкой методов (точно так же, как можно было бы назвать 3.is_a?(Integer) ).

2. @JohnP точно, правила приоритета операторов применяются только при буквальном использовании операторов. (явные вызовы методов не имеют проблем с приоритетом в первую очередь)

3. Вы могли бы подумать о том, чтобы упомянуть, что проблема исчезнет, если 3.0**2 вместо этого использовать OP 3.**2 .

4. @pjs: Хм, интересно. Как вы думаете, это то, к чему они изначально стремились?

5. @SergioTulentsev Да, я думаю, что это то, к чему они стремились. Мне всегда нравится делать нули явными для поплавков, таких как 0.1 vs .1 или 3.0 vs 3. , но я встречал немало людей, которые этого не делают при написании математики, и есть некоторые языки программирования, где это работает.