每种方法的Ruby类方法:通过Bloc学习新手

时间:2014-09-13 11:01:19

标签: ruby methods

我目前是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

2 个答案:

答案 0 :(得分: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对象,并能够进一步对其进行操作。

答案 1 :(得分:1)

看看这句话:

  

遍历数组并返回每个元素的新数组,并添加感叹号。

它不会要求您打印数组的每个元素。它要求你返回一个" new"数组中所有元素都添加了感叹号。

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