2012-10-19 31 views
1

以我的腳本(紅寶石> = 1.9)下面我所定義的表的類,它責任是產生2至10個加法或乘法表(與所選擇的參數)。然後我從一個新的Table實例調用table方法以便將結果打印到一個文件中。存儲由switch語句有一個陣列中的λ,然後用它

這是腳本:

#!/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名試圖並行assignement設置lambda來操作和字符串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>' 

是否有辦法來糾正它,同時保持平行assignement? 在此先感謝。

回答

3

add_operationmul_operation是局部變量,聲明在函數之外,並且不能被函數table訪問。

可以聲明其表函數裏面,或者作爲存儲類變量。

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

謝謝你的答案:如果我想將兩個lambda作爲類變量存儲,我可以調整哪些代碼? (對不起,這個初學者問題) – loloof64

+0

哦,我的天!當然是@@。我已經忘記了。 – loloof64

+1

或類常量:'AddOperation = ...' – tokland

2

你並不需要求助於lambda表達式對於這樣一個簡單的事情作爲二進制操作,定義一個散列operator_symbols包含映射operator_string => operator_symbol和使用這種方式:

operand1.send(operator_symbols[operator_string], operand2) 
+0

謝謝:)我不知道:相貌就像我需要更多地探索Ruby API一樣! (特別是Fixnum類) – loloof64

+0

確實很有趣:3.send(:**,2)#=> 9 – loloof64