《七周七語言:理解多種編程範型》のruby課後習題答案

來源:互聯網
上載者:User

標籤:style   blog   color   使用   io   ar   檔案   資料   art   

本系列是《七周七語言》的課後習題答案。這本書不拘泥於文法細節,而是橫向比較各種程式設計語言(非熱門)之間的編程範式。

是本對編程覺悟能有所協助的好書,這裡就不多做介紹了,感興趣的同學不妨去看一下。

不得不說,Ruby的風格很駭客。

1. 列印字串"Hello, world."

puts "Hello, world."

2. 在字串“Hello, Ruby.”中,找出"Ruby."所在下標。

puts "Hello, Ruby." =~ /Ruby/

3. 列印你的名字十遍

puts "angular "*10

4. 列印字串"This is sentence number 1.", 其中的數字1會一直變化到10。

i = 1..10i.each{|x| puts "This is sentence number #{x}.\n"}

5. 從檔案運行Ruby程式

create test1.rb

write -> puts "hello\n"

save and exit

run -> ruby test1.rb

6. 讓玩家猜隨機數,並告訴玩家猜大還是猜小

guess.rb

input = getsrNum = rand(10)if(input.to_i > rNum)  puts "bigger than #{rNum}"else  puts "not bigger than #{rNum}"end

 7. 分別找到用代碼塊和不用代碼塊讀取檔案的方法,用代碼塊有什麼好處?

File.open("test.rb") do |file|file.each_line{|line| puts "Got #{line.dump}"}end
File.open("test.rb").each{|f|puts "Got #{f}"}

用代碼塊可以傳遞傳遞參數,做更多的操作。

8. 如何把散列錶轉換成數組

hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }

可以用collect/map

hash.collect { |k, v| v }#returns [["a", "b", "c"], ["b", "c"]] 

也可以用values

hash.values

9. ruby的數組可以做棧,還能用來做什麼資料結構

可以用來作隊列,鏈表,棧,集合等等。

10. 有一個數組,包含16個數字。僅用each方法列印數組中的內容,一次列印4個數字,然後,用可枚舉模組的each_slice方法重新做一遍。

myArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]myArray.each do |a|  if a % 4 == 0    print "#{a}\n"  else    print "#{a} "  endend
require ‘enumerator‘myArray =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]myArray.each_slice(4) {|a| p a}

11. 寫一個可以接受散列表和數組嵌套結構的樹類tree

12. 寫一個簡單的grep程式,把檔案中出現某片語的的行權都列印出來。順便加上行號。

puts "grep #{ARGV[0]};"File.open("e:/ruby/reg.txt") do |file|lnNum = 0  file.each_line do |ln|    lnNum +=1    p "Line:#{lnNum} =>  #{ln}" if ln =~ /#{ARGV[0]}/  endend

 13. 修改前面的CSV應用程式,使它可以用each方法返回CsvRow對象。然後,在CsvRow對象上,對某個給定標題,用method_missing方法返回標題所在的列的值。

比如,對於包含以下內容的檔案:

one,two

lions,tigers

API可以像下面這樣操作:

csv=RubyCsv.new

csv.each(|row| puts row.one)

這會列印出"lions"

module ActsAsCsv    def self.included(base)        base.extend ClassMethods    end    module ClassMethods        def acts_as_csv            include InstanceMethods        end    end    module InstanceMethods        def read            @csv_contents = []            filename = self.class.to_s.downcase + ‘.txt‘            file = File.new(filename)            @headers = file.gets.chomp.split(‘, ‘)            file.each do |row|                @csv_contents << row.chomp.split(‘, ‘)            end        end        def each            self.csv_contents.each do |row|                i = CsvRow.new(row)                yield i            end        end        attr_accessor :headers, :csv_contents        def initialize            read        end    endendclass CsvRow    def initialize(row)        @contents = row    end    def method_missing name, *args        num = name.to_s        if num == ‘one‘            @contents[0]        elsif num == ‘two‘            @contents[1]        end    endendclass RubyCsv    include ActsAsCsv    acts_as_csvendm = RubyCsv.newputs "Start...\n";m.each do |row| puts row.oneendputs "end...\n"

其中自訂了Csvrow類,重寫了該類的method_missing方法,使得預設的one/two方法可以成為參數靈活使用。

總結:

Ruby的開放類和模組(能寫程式的程式),使得程式員可以把行為附加在文法上,這有別於傳統的類繼承。

《七周七語言:理解多種編程範型》のruby課後習題答案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.