什么是Ruby方式写入多个文件

时间:2013-07-07 23:19:59

标签: ruby

什么是“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方式来编写多个文件?

2 个答案:

答案 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中比其他语言更强大的 更强大的约定,所以请遵循它。