我对这个很困惑。我有几个可行的解决方案,但我都不喜欢它们中的任何一个。手头的问题是我试图在 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 的一个很好的用例?
最佳答案
您通常可以通过使用 block 来避免 eval
。例如,根据方法调用重新定义您的结构:
columns = [
[ "Client", lambda { |piece| piece.client.organization } ],
[ "Category", lambda { |piece| piece.client.category } ],
# ...
]
然后在遍历您的 block 时,执行如下操作:
pieces.each do |piece|
spec.each do |label, proc|
value = proc.call(piece)
# ... Do whatever you need here
end
end
定义 block (Proc 内部)可以帮助定义做事的方法,同时将变量绑定(bind)推迟到将来的某个时间点。
eval
以危险着称,因为它可以执行任何操作。除非真的没有其他办法,否则最好避免使用它。
关于Ruby 风格提示 : Avoid eval, 并保持清晰有序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233865/