Один пробел влияет на значение, возвращаемое *
:
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]]]]]
Видно, что есть большая разница.
Как ипочему выражения возвращают другое значение?