ruby - 将 lambda 存储在通过 switch 语句获取的数组中,然后使用它

标签 ruby arrays lambda switch-statement

在我下面的脚本(适用于 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>'

有没有办法在保持并行分配的同时更正它? 提前致谢。

最佳答案

add_operationmul_operation 是局部变量,在函数外声明,不能被函数table 访问。

可以在表函数中声明,也可以存储为类变量。

def table(...)
  add_operation = lambda { |op1, op2| op1 + op2 }
  mul_operation = lambda { |op1, op2| op1 * op2 }
  ...
end

关于ruby - 将 lambda 存储在通过 switch 语句获取的数组中,然后使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973638/

相关文章:

ruby-on-rails - 如何对 Nokogiri 节点集进行排序?

javascript - 更改数组值也会更改另一个指定数组中的值

c++ - int *array = new int[n];这个函数实际上在做什么?

c# - 如何在 C# 中返回委托(delegate)函数或 lambda 表达式?

c# - ICollection <T> 到字符串数组(使用字符串属性)

ruby-on-rails - 如何在 Rails 模型的构造函数中使用参数

ruby - 从 ruby​​ 中的 require/load 失败中恢复

c - 在 C 中的 unsigned char 中搜索关键字

c# - 如何将 Expression<Func<int>> 传递给函数

ruby-on-rails - delayed_job -i 通过 cron 脚本通过 ruby​​ 停止之前的进程后将不会启动