创建要在数组上调用的方法

时间:2018-01-15 17:19:12

标签: ruby oop

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

在方法中访问数组的各个元素

4 个答案:

答案 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