0

根据表达式的评估方式,将“if”语句写入两个可能文件之一的“Ruby 方式”是什么?

在 Perl 中,我会执行以下操作来循环遍历数组,检查哈希中的键。输出将酌情写入“existing-keys.txt”或“missing-keys.txt”。

giant_hash = { 'k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3' }
check_array = ['k1', 'k3', 'k4']

f1 = File.open('existing-keys.txt', 'w')
f2 = File.open('missing-keys.txt', 'w')

check_array.each do |check_key|
    if giant_hash.has_key?(check_key)
        f1.puts check_key
    else 
        f2.puts check_key
    end
end

f1.close
f2.close

那行得通,但是我是 Ruby 新手,并且遇到过很多次有更多类似 Ruby 的方法来做事。是否有更多的 Ruby 方式来编写多个文件?

4

2 回答 2

4

如果迭代两次的性能开销不是太大(很可能不是),你可以做两次——最简单的方法是

File.open('existing-keys.txt','w') do |f|
  f.puts check_array.select { |k| giant_hash.has_key? k }
end

File.open('missing-keys.txt','w') do |f|
  f.puts check_array.reject { |k| giant_hash.has_key? k }
end

或者你可以使用(我认为这是最好的方法)

existing, missing = check_array.partition { |k| giant_hash.has_key? k }

File.open('existing-keys.txt','w') { |f| f.puts existing }
File.open('missing-keys.txt','w') { |f| f.puts missing }

这更简洁/更具表现力,并且可能消除了两次通过 check_array 的一些开销。

如果您使用的是 1.9.3+,则可以使用File.write

File.write('existing-keys.txt',existing * "\n")
File.write('missing-keys.txt',missing * "\n")

但我不认为这是必要的/惯用的。还是一个选择。

于 2013-07-07T23:41:12.000 回答
0

基本一样。如果 Ruby 中的语句实际上返回值,我想你可以利用这个事实,尽管它可能变得不那么可读。你也可以使用三元(你也可以在 Perl 中这样做):

check_array.each do |check_key|
  (giant_hash.has_key?(check_key) ? f1 : f2).puts check_key
end

顺便说一句,在 Ruby 中总是使用 2 个空格来缩进。这在 Ruby 中比在其他语言中要强得多,因此请遵循它

于 2013-07-07T23:27:24.903 回答