为了账号安全,请及时绑定邮箱和手机立即绑定

指定_(下划线)变量的位置和方式是什么?

指定_(下划线)变量的位置和方式是什么?

翻过高山走不出你 2019-09-02 08:51:59
大多数人都知道_IRB作为最后回报价值的持有人的特殊含义,但这不是我在这里要求的。相反,我问的是什么_时候用作普通旧Ruby代码中的变量名。在这里它似乎有特殊的行为,类似于“不关心变量”(àlaProlog)。以下是一些说明其独特行为的有用示例:lambda { |x, x| 42 }            # SyntaxError: duplicated argument namelambda { |_, _| 42 }.call(4, 2) # => 42lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'lambda { |_| _ + 1 }.call(42)   # => 43lambda { |_, _| _ }.call(4, 2)  # 1.8.7: => 2                                # 1.9.3: => 4_ = 42_ * 100         # => 4200_, _ = 4, 2; _  # => 2这些都直接在Ruby中运行(puts添加了s) - 不是IRB-以避免与其附加功能冲突。这完全是我自己的实验的结果,因为我无法在任何地方找到关于此行为的任何文档(不可否认,这不是搜索最容易的事情)。最后,我很好奇所有这些内部是如何工作的,所以我可以更好地理解什么是特别的_。所以我要求提供文档,最好是Ruby源代码(也许是RubySpec),它们揭示了_Ruby中的行为。
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

源中有一些特殊处理可以抑制“重复参数名称”错误。错误消息只出现在shadowing_lvar_gen内部parse.y,1.9.3版本如下所示:


static ID

shadowing_lvar_gen(struct parser_params *parser, ID name)

{

    if (idUScore == name) return name;

    /* ... */

并且idUScore是在定义id.c这样的:


REGISTER_SYMID(idUScore, "_");

你会看到类似的特殊处理warn_unused_var:


static void

warn_unused_var(struct parser_params *parser, struct local_vars *local)

{

    /* ... */

    for (i = 0; i < cnt; ++i) {

        if (!v[i] || (u[i] & LVAR_USED)) continue;

        if (idUScore == v[i]) continue;

        rb_compile_warn(ruby_sourcefile, (int)u[i], "assigned but unused variable - %s", rb_id2name(v[i]));

    }

}

您会注意到警告在for循环的第二行被禁止。


_我在1.9.3源代码中可以找到的唯一特殊处理是:禁止重复名称错误,并禁止使用未使用的变量警告。除了这两件事之外,_它只是一个普通的旧变量。我不知道有关(次要)特殊性的任何文件_。


在Ruby 2.0中,idUScore == v[i]测试输入warn_unused_var被替换为is_private_local_id:


if (is_private_local_id(v[i])) continue;

rb_warn4S(ruby_sourcefile, (int)u[i], "assigned but unused variable - %s", rb_id2name(v[i]));

并is_private_local_id禁止以下列开头的变量发出警告_:


if (name == idUScore) return 1;

/* ... */

return RSTRING_PTR(s)[0] == '_';

而不仅仅是_自己。所以2.0放松了一些东西。


查看完整回答
反对 回复 2019-09-02
  • 2 回答
  • 0 关注
  • 611 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信