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 行的并行赋值尝试将 lambda 设置为 operation 并将字符串设置为 op_label。实际上,在第 26 行,我想将 lambda 应用于 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_operationmul_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

对于二进制操作这样简单的事情,您不需要使用 lambda,定义一个operator_symbols包含映射的哈希operator_string => operator_symbol并以这种方式使用它:

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