如何逐个调用函数参数

时间:2011-11-22 17:58:36

标签: ruby currying

我有一个Ruby文件来生成测试结果报告。在那里我定义了很多变量,比如测试用例名称,版本号,然后是module1结果,然后是模块2结果和最终结果。

现在我把它作为一个带有参数的函数作为所有变量。另一个Ruby文件需要逐个调用参数。意思是在Testcase.rb的启动时,我将编写testcase name = Test1;然后版本号为0.1。然后当module1运行时,我会将结果更新为pass或fail,然后类似于module2。但我不知道如何一次调用一个参数。

这些是我报告中的变量.rb = tc_name,version,tester,login_result,checkout_result,signout_result。

在我的测试用例中,我必须逐个传递值。请帮忙。

2 个答案:

答案 0 :(得分:2)

这个想法叫做“currying” 谷歌搜索'红宝石currying'将给你很多点击。
查看this SO answer了解一些示例。

答案 1 :(得分:1)

如果你有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(!)