我有一个设置月份的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'
知道我做错了吗?
本
答案 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