Everyday Scripting with Ruby 讀書筆記(1)

[size=small]---
第一個腳本:比較文件清單
A First Script: Comparing File Inventories
---[/size]

#---
# Excerpted from "Everyday Scripting in Ruby"
# We make no guarantees that this code is fit for any purpose.
# Visit http://www.pragmaticprogrammer.com/titles/bmsft for more book information.
#---
def check_usage
unless ARGV.length == 2 # 註釋②
puts "Usage: differences.rb old-inventory new-inventory"
exit
end
end

def boring?(line)
line.chomp.split('/').include?('temp') or
line.chomp.split('/').include?('recycler')
end

def contains?(line, key)
line.chomp.split('/').include?(key) # 註釋⑥
end

def boring?(line, boring_words)
boring_words.any? do | a_boring_word | # 註釋⑤
contains?(line, a_boring_word)
end
end

def inventory_from(filename)
inventory = File.open(filename)
downcased = inventory.collect do | line | # 註釋③
line.downcase
end
downcased.reject do | line | # 註釋④
# contains?(line, 'temp') or contains?(line, 'recycler')
boring?(line, ['temp','recycler'])
end
end

def compare_inventory_files(old_file, new_file)
old_inventory = inventory_from(old_file)
new_inventory = inventory_from(new_file)

puts "The following files have been added:"
puts new_inventory - old_inventory

puts ""
puts "The following files have been deleted:"
puts old_inventory - new_inventory
end

if $0 == __FILE__ # 註釋①
check_usage
compare_inventory_files(ARGV[0], ARGV[1])
end


[color=indigo][b]① $0表示在命令行裏出現的運行腳本的名字, __FILE__表示腳本的名字, 如果是在命令行裏運行的腳本則執行,否則什麼也不做..[/b][/color]
irb(main):001:0> __FILE__
=> "(irb)"
irb(main):002:0> $0
=> "D:/ruby/bin/fxri.rbw"

[color=indigo][b]② unless意爲"除非", 相當於if not..[/b][/color]
irb(main):012:0> def check_unless(x)
irb(main):013:1> unless x==2
irb(main):014:2> puts "x does not equal 2"
irb(main):015:2> end
irb(main):016:1> end
=> nil
irb(main):017:0> check_unless(2)
=> nil
irb(main):018:0> check_unless(3)
x does not equal 2
=> nil

[color=indigo][b]③ 迭代器collect: 收集代碼塊每次執行的值, 然後放入一個新的數組作爲返回值..[/b][/color]
irb(main):019:0> [1, 2, 3].collect do | ele |
irb(main):020:1* ele * 2
irb(main):021:1> end
=> [2, 4, 6]

[color=indigo][b]④ 迭代器reject: 過濾代碼塊返回爲真的所有元素, 然後放入一個新的數組作爲返回值..[/b][/color]
irb(main):022:0> [1, 2, 3].reject do | ele |
irb(main):023:1* ele == 2
irb(main):024:1> end
=> [1, 3]

[color=indigo][b]⑤ 迭代器any: 數組中任意一個元素使得附帶的代碼塊返回true, 則返回true..[/b][/color]
irb(main):028:0> [1, 2, 3].any? do | ele |
irb(main):029:1* ele > 2
irb(main):030:1> end
=> true

[color=indigo][b]⑥ chomp用來去掉"\n"字符..[/b][/color]
irb(main):031:0> "end\n".chomp
=> "end"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章