无法获得setter方法

时间:2017-08-11 13:37:31

标签: ruby

我有一个设置月份的setter方法。它需要返回一个字符串'01' - '12'。我希望ti能够接受数字和文本(3个数月和整个月。我正在通过估算8月来测试它但是无法工作。它将@month设置为与imput相同(8月)。 / p>

代码是

def month=(month)
  # this can take a number or string, either with 3 char month or full month
  # it returns a 2 char string, left padded with 0s

  if !month.numeric?
    case month.upcase[0,3]
    when 'JAN'
      month = '01'
    when 'FEB'
      month = '02'
    when 'MAR'
      month = '03'
    when 'APR'
      month = '04'
    when 'MAY'
      month = '05'
    when 'JUN'
      month = '06'
    when 'JUL'
      month = '07'
    when 'AUG'
      month = '08'
    when 'SEP'
      month = '09'
    when 'OCT'
      month = '10'
    when 'NOV'
      month = '11'
    when 'DEC'
      month = '12'
    else
      month = '00'
    end
  end if
    @month=month.rjust( 2, '0' )
end

我用

来称呼它
event.month = "Aug"
p event.month

现在这里真的很怪异。如果我添加一个p行

            end if
            p month
            @month=month.rjust( 2, '0' )
    end

打印“Aug”但该方法有效,'p event.month'在调用之后返回'08'

知道我做错了吗?

1 个答案:

答案 0 :(得分:3)

end if应为end

尾随if的存在意味着不会运行此案例陈述,除非以下内容为真",因此您的案例陈述仅在您已设置{后{1}}实例变量。

这等同于

@month

所以改成它:

if @month=m.rjust(2, '0')
  if !month.numeric?
    case month.upcase[0,3]
    # when/else statements
    end
  end
end

使您的代码有效。

通过将end @month=month.rjust(2, '0') 语句添加到debug中,可以首先计算它,因此case语句会运行(因为p month的返回值是真实的),然后是{{1分配,所以你的代码以正确的顺序运行。

到处玩,我注意到如果你传递了一个数字而不是数字字符串,p会失败,所以我建议将其更改为:

@month

通过保存.rjust的结果,而不是在每个@month=month.to_s.rjust(2, '0') 中执行分配,可以大大简化您的case语句:

case

或者,您可以这样做,完全消除案例陈述:

when