Если у вас есть 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(!)