代码之家  ›  专栏  ›  技术社区  ›  Cheng

在Ruby的C源代码中,Ruby操作符`=`是在哪里定义的?

  •  4
  • Cheng  · 技术社区  · 14 年前

    我想读一下 = ,但找不到。

    更新:

    我找到了 test_multi 方法text/ruby/test_assignment.rb。这是Ruby代码,但似乎可以让我到达目的地。

    我想检查代码的原因是找到它如何处理多重分配。喜欢 a,b,c = [1,2,3] .

    更新:

    我找到关键词“masgn”,并引导我

    compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped) 在编译C中

    http://github.com/ruby/ruby/commit/e39eb9dab50eaa681467e51145b37cdc11667830#diff-2

    3 回复  |  直到 14 年前
        1
  •  0
  •   Jörg W Mittag    14 年前

    我不知道你所说的“Ruby的C源代码”是什么意思。Ruby是一种编程语言。编程语言没有源代码(只有编译器和解释程序有),它们有 规格 .

    多个分配的规范在第节中。 11.3.1.3多重分配 在当前第59-62页(2009-12-01) ISO Ruby Draft Specification 而在 language/variables_spec.rb (寻找) 倍数 “,不幸的是,测试在可执行文件中有点分散 RubySpec .

    在Rubinius编译器(抱歉,这里也没有C源代码)的482-607行中可以找到可能实现的一个很好的概述。 lib/compiler/ast/variables.rb .

        2
  •  2
  •   codaddict    14 年前

    我想你找不到 = .

    这个 = 将是定义Ruby语言的语法规则的一部分,解析器(用C语言编写)将使用语法。

        3
  •  1
  •   zzzhc    14 年前

    http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_9_2/parse.y 线路1088-1116

    | var_lhs tOP_ASGN command_call
            {
            /*%%%*/
            value_expr($3);
            if ($1) {
                ID vid = $1->nd_vid;
                if ($2 == tOROP) {
                $1->nd_value = $3;
                $$ = NEW_OP_ASGN_OR(gettable(vid), $1);
                if (is_asgn_or_id(vid)) {
                    $$->nd_aid = vid;
                }
                }
                else if ($2 == tANDOP) {
                $1->nd_value = $3;
                $$ = NEW_OP_ASGN_AND(gettable(vid), $1);
                }
                else {
                $$ = $1;
                $$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3));
                }
            }
            else {
                $$ = NEW_BEGIN(0);
            }
            /*%
            $$ = dispatch3(opassign, $1, $2, $3);
            %*/
            }