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

标签 ruby arrays eval

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

相关文章:

ruby - 在 Ruby 中确定变量是否为数字的最佳方法是什么?

javascript - JSON 数组无法使用 Eval 进行解码

python - python 中的评估安全性,从 JSON 中提取字符串

C - 将 char * 数组索引转换为字符串,并进行比较

linux - Bash- 将文件解析为数组

php - 如何使用 php 使用随机化链接

php - 如何将字符串转换为包含数学运算的数字?

ruby - 用 cookie 模拟 Ruby 中的浏览器?

ruby - ruby 中的短 namespace 首字母缩写词

ruby - 如何确定 Big O 比较 Ruby 中的两个数组