2014-09-13 57 views
2

我目前是一個通過Bloc的學生,並且正在使用類方法掙扎。我正在通過每種方法的教訓。指令的第一部分是:每種方法的Ruby類方法:通過Bloc學習新手

讓我們將這個新的每個技巧與我們一直在練習的Class概念混合在一起。創建一個ArrayModifier類。應該採取的陣列作爲參數傳遞給它的功能initialize,並且具有一個實例方法:

  • exclaim - 遍歷陣列和帶有驚歎號添加返回每個元素的一個新的數組。

這裏是我到目前爲止想出的,但我不知道我做錯了。我特別不明白初始化和如何正確使用它。

class ArrayModifier 

    attr_accessor :array 

    def initialize(array) 
    @array = array 
    end 

    def exclaim 
    @array.each do |i| 
     puts i + "!" 
    end 
    @array 
    end 

end 
+0

「退貨」不明確。在你的代碼嘗試中,你把每個元素都放進去,而不是把它們返回。很高興知道問題所要求的是什麼。 – 2014-09-13 11:10:01

+0

集團是什麼? .............. – sawa 2014-09-13 11:29:28

+0

@sawa我認爲[這是](https://www.bloc.io/) – 2014-09-13 13:10:30

回答

1

看的句子:

循環通過陣列,並返回各元素的以感嘆號加入一個新的數組。

它不要求您打印數組的每個元素。它要求你返回一個「新」數組,並且所有元素都添加了一個感嘆號。

class ArrayModifier 

    attr_accessor :array 

    def initialize(array) 
    @array = array 
    end 

    def exclaim 
    new_array = [] 
    @array.each do |i| 
     new_array << i.to_s + "!" 
    end 
    new_array 
    end 
end 

的驚歎方法的一個更好的選擇:

def exclaim 
    @array.map{|e| "#{e}!"} 
end 
2

您使用初始化是正確的。所有必須做的是捕獲並保存在發送的數組。如果你想成爲幻想,你可能會寫

def initialize(arr) 
    raise ArgumentError unless arr.is_a?(Array) 
    @array = arr 
end 

因爲,畢竟,如果我們沒有在實際傳遞數組,那麼所有即將發生的事情將會失敗。當你進入更高級的編程時,你會看到這種模式。

puts不會「返回」的東西,只是「打印」出來,留下的實際返回值@array與以前一樣。

您正在學習each,但是當您閱讀關於該方法的文檔時,您會看到它具有類似的「堂兄弟」。我覺得在這種情況下,你想用map:「!」

def exclaim 
    @array.map do |i| 
    "#{i}!" 
    end 
end 

這需要每一個元素的數組,插值成具有與字符的後綴字符串String interpolation是無安全的,這使它成爲簡潔的最佳實踐。由於這種陣列修飾是該方法中唯一的表達式,因此該方法的結果爲return

irb調試器會將.exclaim的結果打印到屏幕上,但是其他Ruby代碼會將此return作爲ruby對象捕獲並能夠進一步處理它。