如果你有Ruby 1.9的,這也許能滿足您的需求:
report = ->(tc_name, version, tester, login_result, checkout_result) do
puts <<-ENDOUTPUT
Test Case: #{tc_name}
Version: #{version}
Tester: #{tester}
Login Res: #{login_result}
Checkout Res: #{checkout_result}
ENDOUTPUT
end
test1 = report.curry["Test1"]
v12 = test1["v1.2"]
me12 = v12["Phrogz"]
me12["Success"]["Failed"]
#=> Test Case: Test1
#=> Version: v1.2
#=> Tester: Phrogz
#=> Login Res: Success
#=> Checkout Res: Failed
v13 = test1["v1.3"]
me13 = v13["Phrogz"]
me13["Success"]["Success"]
#=> Test Case: Test1
#=> Version: v1.3
#=> Tester: Phrogz
#=> Login Res: Success
#=> Checkout Res: Success
或者(和可能不太容易混淆),你可以代替保持鍵的散列的軌道。一旦你積累了你需要的所有密鑰,你就可以對它們做些什麼;否則你只需將任何新數據合併到散列並將其傳回。這提供了相同的局部應用好處上面,並且還可以讓你積累的變量以任何順序:
def report(data={},more={})
data = data.merge(more)
if data.key?(:tc_name) && data.key?(:version) && data.key?(:tester) &&
data.key?(:login_result) && data.key?(:checkout_result)
puts <<-ENDOUTPUT
Test Case: #{data[:tc_name]}
Version: #{data[:version]}
Tester: #{data[:tester]}
Login Res: #{data[:login_result]}
Checkout Res: #{data[:checkout_result]}
ENDOUTPUT
else
data # send the newly-merged data back to the user
end
end
test1 = report tc_name:"Test1"
me = report test1, tester:"Phrogz"
v12 = report me, version:"v1.2"
report v12, login_result:"Success", checkout_result:"Failed"
#=> Test Case: Test1
#=> Version: v1.2
#=> Tester: Phrogz
#=> Login Res: Success
#=> Checkout Res: Failed
v13 = report me, version:"v1.3"
report v13, login_result:"Success", checkout_result:"Success"
#=> Test Case: Test1
#=> Version: v1.3
#=> Tester: Phrogz
#=> Login Res: Success
#=> Checkout Res: Success
然而,沒有必要的功能合併在價值觀和積累數據。你可以在簡單的哈希中自己做這個:
BAD_LOGIN = { login_result:"FAILED" }
ALL_GOOD = { login_result:"OK", checkout_result:"OK" }
ME = { tester:"Phrogz" }
def report(data)
puts <<-ENDOUTPUT
Test Case: #{data[:tc_name]}
Tester: #{data[:tester]}
Login Res: #{data[:login_result]}
Checkout Res: #{data[:checkout_result]}
ENDOUTPUT
end
report ME.merge(tc_name:"Test1").merge(BAD_LOGIN)
#=> Test Case: Test1
#=> Tester: Phrogz
#=> Login Res: FAILED
#=> Checkout Res:
ok = {tc_name:"Test2"}.merge(ME).merge(ALL_GOOD)
report ok
#=> Test Case: Test2
#=> Tester: Phrogz
#=> Login Res: OK
#=> Checkout Res: OK
report ok.merge(checkout_result:"CAUGHT FIRE(!)")
#=> Test Case: Test2
#=> Tester: Phrogz
#=> Login Res: OK
#=> Checkout Res: CAUGHT FIRE(!)
你使用的是Ruby 1.8還是Ruby 1.9? (答案因Ruby內置的功能而異。) – Phrogz