什么是“Ruby方式”,根据表达式的计算方式,将“if”语句写入两个可能的文件之一?
在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方式来编写多个文件?
答案 0 :(得分: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")
但我不认为这是必要的/作为惯用语。还是一个选择。
答案 1 :(得分:0)
基本相同。我想你可以利用这个事实,如果Ruby中的语句实际上返回值,尽管它可能变得不那么可读。你也可以使用三元组(你也可以在Perl中这样做):
check_array.each do |check_key|
(giant_hash.has_key?(check_key) ? f1 : f2).puts check_key
end
顺便说一句,总是在Ruby中使用2个空格进行缩进。这是Ruby中比其他语言更强大的 更强大的约定,所以请遵循它。