gpt4 book ai didi

Ruby 风格提示 : Avoid eval, 并保持清晰有序

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:50 27 4
gpt4 key购买 nike

我对这个很困惑。我有几个可行的解决方案,但我都不喜欢它们中的任何一个。手头的问题是我试图在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com