test_cal
是自定义类的实例,get_calendar_items
返回一个数组。我想写一个像这样在数组上调用的方法:
test_cal.get_calendar_items.get_subject
这是我写的方法
def get_subject(number)
puts self[number].subject
end
然而,ruby给出了一个错误:
undefined method get_subject for #<Array:0x00 ...> (NoMethodError)
如何编写可在数组上调用的方法?
我假设每个数组都是某种对象。
然后,通过number
。
答案 0 :(得分:3)
您必须在Array类
中定义它class Array
def get_subject(number)
puts self[number].subject
end
end
由于您是Ruby的新手,您应该知道这种方法不是很好,因为它很大程度上取决于数组中存储的对象。例如,我可以执行[1].get_subject(0)
或["foo"].get_subject(0)
,但我会收到错误,因为数字和字符串不具有subject
方法。
答案 1 :(得分:1)
尽管你可以定义一个Array
实例方法来解决你的问题,但由于很多原因,定义一个Core类的方法被认为是一种不好的做法。更好的是f.e.在test_cal
类中定义另一个从subject
获取get_calendar_items
的方法:
class TestCal # or whichever `test_cal` class is
def get_calendar_items_subjects
get_calendar_items.map &:subject
end
end
然后:
test_cal.get_calendar_items_subjects[number]
答案 2 :(得分:0)
通常,只有在可以在所有阵列上调用的方法时才会扩展Array。由于主题是数组内容的先决条件方法,我认为添加类似下面的类方法会更好。
class CalendarItem
def self.get_subject(arr, index=0)
arr[index].subject
end
end
重组的代码会读取
CalendarItem.get_subject(test_cal.get_calendar_items)
答案 3 :(得分:0)
def get_subject(number)
puts self[number].subject
end
您只需按以下方式调用上述方法:
test_cal.get_calendar_items.each do |number|
get_subject(number)
end