我目前是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 :(得分: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