2016-10-03 46 views
0

我有下面的代碼,它運行良好:這個Ruby類更改名稱將導致錯誤

class Array 
    def my_name 
    first_name = "Bob" 
    last_name = "Smith" 
    yield(first_name, last_name) 
    end 
end 

['a', 'b', 'c', 'd'].my_name {|i, x| puts "#{i} #{x}"} 

但此刻我改變類的名字從「陣列」到別的東西,比如說「 Array1「,我得到以下錯誤:

`<main>': undefined method `my_name' for ["a", "b", "c", "d"]:Array        (NoMethodError) 

我不確定那個錯誤意味着什麼,但它破壞我的代碼。這是破碎的代碼:

class Array1 
    def my_name 
    first_name = "Bob" 
    last_name = "Smith" 
    yield(first_name, last_name) 
    end 
end 

['a', 'b', 'c', 'd'].my_name {|i, x| puts "#{i} #{x}"} 

對於我的生活,我無法弄清楚什麼是錯的。我真的只是想弄清楚如何在類中的方法上使用yield函數。我真的遇到了麻煩,如果有人可以幫助我,將不勝感激。謝謝!

+0

順便說一句 - 'yield'不是一個函數,但關鍵字(即相同的地位,'def'或'end',而不是相同的地位,例如'puts')。 – Amadan

回答

2

['a', 'b', 'c', 'd']是類Array(不是Array1類)的實例。爲了能夠調用類Array1中定義的方法,您應該首先創建該類的一個實例。

Array1.new.my_name {|i, x| puts "#{i} #{x}"} 
# Bob Smith 
#=> nil 
+1

對數組進行子類化是一個糟糕的主意。如果只是爲了添加一個方法而完成,那麼就是雙倍的。 –

+0

但我想這裏是我困惑的地方。我將前面指定的兩個類放在單獨的文件中。他們不應該單獨運行嗎?爲什麼是['a','b','c','d']和Array的實例,如果Array在我的.rb文件中不存在? – John123

+2

@ John123數組是一個核心類。您始終可以訪問它及其方法。 –

3

由於未知的原因,您試圖在Array實例上調用新引入的方法。它所屬叫它:

Array1.new.my_name { |i, x| puts "#{i} #{x}" } 
相關問題