1

ruby 1.9.3-p194 を使用した次のコードで警告が表示されます

if (x = true)
  puts 'it worked'
end

# => warning: found = in conditional, should be ==

ただし、配列を割り当てても警告はありません

if (x = [true])
  puts 'it worked'
end

# => 'it worked', then returns nil since return of 'puts' is nil

文字列を使用すると警告が発生するのはなぜですか? または、より良い質問かもしれませんが、配列を使用しても警告が発生しないのはなぜですか?

4

2 に答える 2

4

(リテラル: Fixnum、Symbol、String)、nil および true/false を割り当てると Ruby が警告を報告する

ruby-1.9.3-p194

parse.c:15026

static int
assign_in_cond(struct parser_params *parser, NODE *node)
{
    switch (nd_type(node)) {
      case NODE_MASGN:
        yyerror("multiple assignment in conditional");
        return 1;

      case NODE_LASGN:
      case NODE_DASGN:
      case NODE_DASGN_CURR:
      case NODE_GASGN:
      case NODE_IASGN:
        break;

      default:
        return 0;
    }

    if (!node->nd_value) return 1;
    switch (nd_type(node->nd_value)) {
      case NODE_LIT:
      case NODE_STR:
      case NODE_NIL:
      case NODE_TRUE:
      case NODE_FALSE:
        /* reports always */
        parser_warn(node->nd_value, "found = in conditional, should be ==");
        return 1;

      case NODE_DSTR:
      case NODE_XSTR:
      case NODE_DXSTR:
      case NODE_EVSTR:
      case NODE_DREGX:
      default:
        break;
    }
    return 1;
}
于 2012-09-03T07:29:33.293 に答える
2
  • 両方のプログラムの出力は「機能しました」と同じです。
  • 両方のプログラムが割り当てステートメントの値を使用している
  • 1つ目は、通常は間違いを示しているとコンパイラが判断するパターンを使用します (したがって、警告が表示されます)。
  • 2 つ目は、(明らかに) 複雑すぎて警告メッセージをトリガーできない式を使用しています。
于 2012-09-03T07:35:37.877 に答える