#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
вместо этого использовать OP3.**2
.4. @pjs: Хм, интересно. Как вы думаете, это то, к чему они изначально стремились?
5. @SergioTulentsev Да, я думаю, что это то, к чему они стремились. Мне всегда нравится делать нули явными для поплавков, таких как
0.1
vs.1
или3.0
vs3.
, но я встречал немало людей, которые этого не делают при написании математики, и есть некоторые языки программирования, где это работает.