2016-11-25 58 views
0

我做了一個簡單的程序與一個單一的方法,我試圖測試它,但我一直得到這個奇怪的錯誤,我不知道爲什麼它繼續發生。 這是我對我寫的唯一方法代碼:我得到一個「未定義的方法」新...「(每次更改的數字)」

def make_database(lines) 
     i = 0 
     foods = hash.new() 
     while i < lines.length do 
     lines[i] = lines[i].chomp() 
     words = lines[i].split(',') 
     if(words[1].casecmp("b") == 0) 
      foods[words[0]] = words[3] 
     end 
     end 
    return foods 
    end 

然後這裏是我有調用方法(同一程序中)。

if __FILE__ == $PROGRAM_NAME 
    lines = [] 
    $stdin.each { |line| lines << line} 
    foods = make_database(lines).new 
    puts foods 
    end 

我很痛苦迷茫,特別是因爲它給了我一個不同的隨機數爲每個「未定義的方法‘新’的(隨機數)」。

回答

2

這是一個簡單的錯誤。 hash調用當前對象返回索引條目使用的哈希結構的數量,其中Hash是哈希類你可能打算在一個方法:

foods = Hash.new() 

或者更簡潔地說:

foods = { } 

它是理想的使用{ }代替Hash.new,除非你需要指定諸如違約,因爲是這樣用:

Hash.new(0) 

默認情況下,所有值都初始化爲0。這在創建簡單計數器時非常有用。

Ruby類是由大寫字母標識以避免混淆。一旦你習慣了語法,你就會更容易發現類似的錯誤。

請注意,在編寫Ruby代碼時,您幾乎總是會在空的參數列表中省略大括號/括號。那就是x()簡單表示爲x。這使得代碼更易讀,鏈接特別是,像x.y.z代替x().y().z()

其他注意事項包括能夠讀取與readlines所有行,而不是你有什麼存在,可以手動編寫它。嘗試:

make_database($stdin.readlines.map(&:chomp)) 

你的代碼更積極的重構是這樣的:

def make_database(lines) 
    # Define a Hash based on key/value pairs in an Array... 
    Hash[ 
    # ...where these pairs are based on the input lines... 
    lines.map do |line| 
     # ...which have comma-separated components. 
     line.split(',') 
    end.reject do |key, flag, _, value| 
     # Pick out only those that have the right flag. 
     flag.downcase == 'b' 
    end.map do |key, flag, _, value| 
     # Convert to a simple key/value pair array 
     [ key, value ] 
    end 
    ] 
end 

這可能是有點難以遵循,但一旦你鏈接在一起的一系列否則簡單的竅門操作你的Ruby代碼將會更加靈活和容易閱讀。

+0

將塊拆分爲lambda可能會使事情更容易遵循,然後可以說'lines.map(&into_pieces).reject(&those_i_dont_want).each_with_object({},&add_to_hash)'等等。 –

+0

[將我的線條剪成碎片!](https://youtu.be/j0lSpNtjPM8)[對不起,無法抗拒:-D] –

相關問題