如何使用 Ruby 在条件测试中访问数组的索引值

How to access index value of array in conditional test using Ruby

背景:我正在尝试编写一个生成日历天列表的简单函数,除了一个 if/else 循环外,我大部分时间都在使用它。

相关变量及其初始声明值:

monthsOfYear = %w[January February March April May June July August September October November December]
currentMonthName = "" # empty string
daysInMonth = 0 # integer

相关循环:

monthsOfYear.each do |month| #loop through each month
    # first get the current month name
    currentMonthName = "#{month}" # reads month name from monthsOfYear array
    if ??month == 3 || 5 || 8 || 10 ?? # April, June, September, November 
        daysInMonth = 30
    elsif ??month == 1?? # February
        if isLeapYear
            daysInMonth = 29
        else
            daysInMonth = 28
        end
    else # All the rest
        daysInMonth = 31
    end

我已经标记了我遇到问题的部分 ?? ?? 基本上,我试图弄清楚如何在循环时访问索引的数值并测试该索引号是否与少数特定情况匹配。我广泛搜索了文档,试图找到一种方法 returns 索引数值(不是存储在 x 索引处的值),换句话说,我希望能够读取 Array[x] 中的 x,而不是什么存储在 Array[x]

也许在这种特定情况下,最好测试是否 month == "April" || "June" || "September" || "November" 而不是尝试通过解析数组索引号来构建案例?

但是一般情况下,可以调用什么方法来查找索引号的值呢?或者这甚至可能吗?

要获取数组项的索引,请使用index方法:

monthsOfYear = [ "January", "February", "March", ... ]
monthsOfYear.index("February") #=> 1

如果您要专门查找日期计算, Ruby 有一个内置的方式:

Date.new(date.year, date.month, -1).mday #=> the number of days in the month

如果您想迭代月份和索引,Anthony 的回答是正确的。

monthsOfYear.each_with_index do |month, index| {
  ...
  # The first loop: month = "January", index = 0
  ...
}

如果您正在寻找改进代码的方法,请使用 case 语句:

case month
when "April", "June", "September", "November" 
  daysInMonth = 30
when "February"
  if isLeapYear
    daysInMonth = 29
  else
    daysInMonth = 28
  end
else
  daysInMonth = 31
end

在Ruby中,你可以设置任何等于case语句的结果,而且case语句可以匹配数字,所以可以这样写:

daysInMonth = case monthsOfYear.index(currentMonthName) 
when 3, 5, 8, 10 
  30
when 1
  isLeapYear ? 29 : 28
else
  31
end

Joel 的回答是一个更好的实现,但为了与您的代码保持一致并回答您的问题,Enumerable 有一个 each_with_index 方法 (Enumberable#each_with_index):

monthsOfYear.each_with_index do |month, index|

然后您可以在 if/else 条件中使用索引。请注意,数组是从零开始的,因此一月实际上是 0.