翻译日期星期几的
我来翻译命名一周的天我的母语的方法:翻译日期星期几的
def translate_date(daytime)
case daytime
when daytime.strftime('%A') == 'Monday'
'Poniedziałek'
when daytime.strftime('%A') == 'Tuesday'
'Wtorek'
when daytime.strftime('%A') == 'Wednesday'
'Środa'
when daytime.strftime('%A') == 'Thursday'
'Czwartek'
when daytime.strftime('%A') == 'Friday'
'Piątek'
when daytime.strftime('%A') == 'Saturday'
'Sobota'
when daytime.strftime('%A') == 'Sunday'
'Niedziela'
end
end
我使用它,例如为:
date = Sat, 21 May 2016 00:00:00 UTC +00:00
translate_date(date) # => nil
在哪里的问题这种方法?为什么它会返回nil
?
同时,我得到:
date.strftime('%A') == 'Saturday' # => true`
检查表达case
后表达when
发生这样的事情后:
daytime === (daytime.strftime('%A') == 'Monday')
# => nil
的问题是,你正在试图case
与后比较daytime
when
后nil
。所以,如果全部when
返回nil
,所有表达式返回nil
。
使用case
声明正确:
def translate_date(daytime)
case daytime.strftime('%A')
when 'Monday'
'Poniedziałek'
when'Tuesday'
'Wtorek'
when 'Wednesday'
'Środa'
when 'Thursday'
'Czwartek'
when 'Friday'
'Piątek'
when 'Saturday'
'Sobota'
when 'Sunday'
'Niedziela'
end
end
date = Date.parse("Sat, 21 May 2016 00:00:00 UTC +00:00")
# => Sat, 21 May 2016
translate_date(date)
# => "Sobota"
而且,@AnthonyE在评论中提到的,最好使用internationalization为你的目标。
很好解释。有时使用散列:'day_map = {'Monday'=>'Poniedziałek',...}',然后是'day_map [daytime.strftime('%A')]''。 –
Case
是不是同样喜欢if
如果你想使用情况的方法,因此使用这样的
def translate_date(daytime)
case daytime.strftime('%A')
when 'Monday'
'Poniedziałek'
when 'Tuesday'
'Wtorek'
when 'Wednesday'
'Środa'
when 'Thursday'
'Czwartek'
when 'Friday'
'Piątek'
when 'Saturday'
'Sobota'
when 'Sunday'
'Niedziela'
end
end
但更好的方法是这样的
DAYS_IN_PL = {
'Monday' => 'Poniedziałek',
'Tuesday' => 'Wtorek',
'Wednesday' => 'Środa',
'Thursday' => 'Czwartek',
'Friday' => 'Piątek',
'Saturday' => 'Sobota',
'Sunday' => 'Niedziela'
}
def translate_date(daytime)
DAYS_IN_PL[daytime.strftime('%A')]
end
你做的“更好的方式”解决方案是非常优雅的Ruby。做得很好! –
@MichaelGaskill非常感谢 –
这里是一个稍微更紧凑translate_date,如果日间参数碰巧是字符串,它也会转换为DateTime:
require 'date'
def translate_date(daytime)
daytime = DateTime.parse(daytime) if daytime.is_a?(String)
case daytime.strftime("%A")
when 'Monday' then 'Poniedziałek'
when 'Tuesday' then 'Wtorek'
when 'Wednesday' then 'Środa'
when 'Thursday' then 'Czwartek'
when 'Friday' then 'Piątek'
when 'Saturday' then 'Sobota'
when 'Sunday' then 'Niedziela'
end
end
current_date = DateTime.now
20.times do |offset|
puts "#{current_date.strftime("%F")}: #{translate_date(current_date)}"
current_date = current_date.prev_day
end
这样可以解决case语句的结构性问题,并且使其更易于阅读。
这将输出如下:
2016-05-16: Poniedziałek
2016-05-15: Niedziela
2016-05-14: Sobota
2016-05-13: Piątek
2016-05-12: Czwartek
2016-05-11: Środa
2016-05-10: Wtorek
2016-05-09: Poniedziałek
2016-05-08: Niedziela
2016-05-07: Sobota
2016-05-06: Piątek
2016-05-05: Czwartek
2016-05-04: Środa
2016-05-03: Wtorek
2016-05-02: Poniedziałek
2016-05-01: Niedziela
2016-04-30: Sobota
2016-04-29: Piątek
2016-04-28: Czwartek
2016-04-27: Środa
你可能要考虑使用国际化这一点。 –