1

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

[piece.client.organization, piece.client.category, piece.client.name , piece.campaign.name, piece.name, piece_url(piece.id), piece.campaign.election_date, piece.campaign.win_loss, piece.final_date, piece.local_photos, piece.killed, piece.format_list, piece.artist_list, piece.partner_list, piece.account_executive_list, piece.out_of_stock, piece.total_intake, piece.campaign.candidate_tags, piece.client.spec_list, piece.campaign.mail_poll]

除了它们更长,更笨重。他们工作,但他们让我内心感觉很糟糕。这是当我想到将它们放入二维数组时,它立即使数据看起来更具可读性:

[["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 的一个很好的用例?

4

1 回答 1

3

您通常可以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以危险着称,因为它可以执行任何操作。除非真的没有其他办法,否则最好避免它。

于 2013-03-05T20:57:47.843 回答