2014-09-13 56 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对象捕获并能够进一步处理它。