Ruby风格的小贴士:避免评估,保持事情清晰有序

Ruby风格的小贴士:避免评估,保持事情清晰有序,ruby,arrays,eval,Ruby,Arrays,Eval,我对这件事感到困惑。我有几个可行的解决方案,但我不喜欢其中任何一个。目前的问题是,我正在尝试在Rails应用程序中生成CSV。在我的应用程序中,我有很多值,大约30。我想显示的许多值也在关联上,因此使行更长。。。它们看起来像这样(不用费心去读,只是想让你知道我在说什么): [piece.client.organization,piece.client.category,piece.client.name,piece.campaign.name,piece.name,piece\u url(pie

我对这件事感到困惑。我有几个可行的解决方案,但我不喜欢其中任何一个。目前的问题是,我正在尝试在Rails应用程序中生成CSV。在我的应用程序中,我有很多值,大约30。我想显示的许多值也在关联上,因此使行更长。。。它们看起来像这样(不用费心去读,只是想让你知道我在说什么):

[piece.client.organization,piece.client.category,piece.client.name,piece.campaign.name,piece.name,piece\u url(piece.id),piece.campaign.election\u date,piece.campaign.win\u loss,piece.final\u date,piece.local\u照片,piece.killed,piece.format\u list,piece.artist\u list,piece.partner\u list,piece.account\u executive\u list,piece.out\u库存,piece.total\u摄入量,piece.campaign.候选者标签,piece.client.spec\u列表,piece.campaign.mail\u投票]

除了它们更长更笨重。它们很管用,但它们让我内心很难受。当我想到将它们放在二维数组中时,它立即使数据看起来更可读:

[["Client",       piece.client.organization], 
["Category",      piece.client.category], 
["Client Name",   piece.client.name] , 
...
["Campaign Name", piece.campaign.name], 
["Piece Name",    piece.name]]
太好了,现在我可以在上面循环创建我的CSV行。。。然而,它将根据我需要定义的位置爆炸,因为我的“片段”未定义。于是,我想。。。如果我只是将第二个参数用引号括起来,然后在需要时调用eval呢?然后我查了一下,人们似乎说使用eval只是为了拯救生命


有人能想出一种更简单的方法来保持我的所有数据与列名成对,但可能不使用eval吗?或者可能建议这将是一个很好的eval用例?

您通常可以通过使用块来避免
eval
。例如,根据方法调用重新定义结构:

columns = [
  [ "Client", lambda { |piece| piece.client.organization } ],
  [ "Category", lambda { |piece| piece.client.category } ],
  # ...
]
然后在块上迭代时,执行以下操作:

pieces.each do |piece|
  spec.each do |label, proc|
    value = proc.call(piece)

    # ... Do whatever you need here
  end
end
定义块(内部Proc)有助于定义执行操作的方法,同时将变量绑定推迟到将来某个时候


eval
有危险的名声,因为它可以执行任何事情。除非真的没有其他办法,否则最好避免它。

我很确定
eval
从未拯救过一条生命,可能已经危及了一对夫妇。:)@我正在使用完全相同的样式创建csv。您可以通过跳过每对的内部括号来进一步理顺它。然后,在大数组的末尾添加“]”。在(2)的组中添加“%”。回答很好,很完整。非常感谢你。所有这些lambda积木仍然让事情看起来有点混乱,但我认为这比我现在拥有的要好。现在,我正在试验Thanky lambda语法
->
(lambda对我来说仍然有些抽象,但我已经明白了)。再次感谢!我会记下你的答案,除非很快会有更简洁的答案。再次感谢你,塔德曼!太棒了,我觉得这很好。我想补充一点,声明lambdas的刺刀式语法让我看起来更容易,它现在看起来是这样的:
[“Campaign”,->Campaign{Campaign.name}]