Чувствителен ли рубиновый пробел в определенных случаях? - PullRequest
0 голосов
/ 26 мая 2018

Один пробел влияет на значение, возвращаемое *:

rand * 10 #=> 2.7177010707339146
rand *10  #=> 1

Я пытался использовать Ripper для проверки токенов, созданных этими двумя выражениями.

Ripper.lex 'rand *10'
#=> [[[1, 0], :on_ident, "rand", EXPR_CMDARG],
#   [[1, 4], :on_sp, " ", EXPR_CMDARG],
#   [[1, 5], :on_op, "*", EXPR_BEG],
#   [[1, 6], :on_int, "10", EXPR_END|EXPR_ENDARG]]
Ripper.lex 'rand * 10'
#=> [[[1, 0], :on_ident, "rand", EXPR_CMDARG],
#   [[1, 4], :on_sp, " ", EXPR_CMDARG],
#   [[1, 5], :on_op, "*", EXPR_BEG],
#   [[1, 6], :on_sp, " ", EXPR_BEG],
#   [[1, 7], :on_int, "10", EXPR_END|EXPR_ENDARG]]

За исключениемсо второго по четвертый элемент я не вижу различий.Я думал, что константы справа как-то изменятся.

Теперь с sexp:

Ripper.sexp 'rand *10'
#=> [:program,
# [[:command,
#   [:@ident, "rand", [1, 0]],
#   [:args_add_block, [:args_add_star, [], [:@int, "10", [1, 6]]], false]]]]
Ripper.sexp 'rand * 10'
#=> [:program,
# [[:binary, [:vcall, [:@ident, "rand", [1, 0]]], :*, [:@int, "10", [1, 7]]]]]

Видно, что есть большая разница.

Как ипочему выражения возвращают другое значение?

1 Ответ

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

* в *10 является унарным оператором сплата , тогда как в * 10 это перезаписываемый двоичный оператор (в данном случае разрешается в Float#*),Из AST также видно, что, добавив скобки, эквивалентности выражений таковы:

  • rand *10 - это то же самое, что rand(*10) - это то же самое, что и rand(10).
  • rand * 10 совпадает с (rand) * (10) совпадает с rand.*(10).

Это также может быть подтверждено во время выполнения:

def args(*args); p args; end

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