gpt4 book ai didi

ruby - 在某些情况下,ruby 空格是否敏感?

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:41 25 4
gpt4 key购买 nike

单个空格会影响 * 的返回值:

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

我尝试使用 Ripper 来检查这两个表达式生成的 token 。

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]]]]]

可以看出差别很大。

表达式如何以及为什么返回不同的值?

最佳答案

*10中的*unary splat operator ,而在 * 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 []

关于ruby - 在某些情况下,ruby 空格是否敏感?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50543569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com