1

以下の私のスクリプト(Ruby> = 1.9の場合)では、Tableクラスを定義しました。このクラスの責任は、2から10の加算または乗算テーブル(パラメーターで選択)を生成することです。次に、結果をファイルに出力するために、新しいTableインスタンスからtableメソッドを呼び出します。

これはスクリプトです:

#!/usr/bin/env ruby

class Table

HEADER_LINE = "="*25
add_operation = lambda { |op1, op2| op1 + op2 }
mul_operation = lambda { |op1, op2| op1 * op2 }

def table(req_operation = :mul)

    operation, op_label =   case req_operation
                            when :add
                                [add_operation, "+"]
                            when :mul
                                [mul_operation, "*"]
                            else
                                raise "Unknown operation #{req_operation} !"
                            end


    (2..10).each do |op1|
        yield HEADER_LINE
        yield "Table de #{op1} (x#{op_label}y)"
        yield HEADER_LINE
        (1..10).each do |op2|
            yield line = "#{op1} #{op_label} #{op2} = #{operation.call(op1, op2)}"
        end
        yield HEADER_LINE
        yield
    end
end

end

File.open("MyFile", "w") do |file|
    Table.new.table do |line|
        file.write "#{line}\n"
    end
end

11行目の並列割り当てでは、ラムダを操作に設定し、文字列をop_labelに設定しようとします。実際、26行目では、ラムダをop1とop2のローカル変数に適用したいと思います。

しかし、次のエラーが発生します。

./operation_table.rb:15:in `table': undefined local variable or method `mul_operation' for #<Table:0x00000000f1fc48> (NameError)
    from ./operation_table.rb:38:in `block in <main>'
    from ./operation_table.rb:37:in `open'
    from ./operation_table.rb:37:in `<main>'

並列割り当てを維持しながら修正する方法はありますか?前もって感謝します。

4

2 に答える 2

3

add_operationおよびmul_operationは、関数の外部で宣言されたローカル変数であり、関数からアクセスすることはできませんtable

テーブル関数内で宣言するか、クラス変数として格納できます。

def table(...)
  add_operation = lambda { |op1, op2| op1 + op2 }
  mul_operation = lambda { |op1, op2| op1 * op2 }
  ...
end
于 2012-10-19T11:52:22.100 に答える
2

バイナリ操作のような単純なことにラムダに頼る必要はありませんoperator_symbols。マッピングを含むハッシュを定義し、次のoperator_string => operator_symbolように使用します。

operand1.send(operator_symbols[operator_string], operand2)
于 2012-10-19T12:02:55.270 に答える