我有一种方法可以将一周的命名天数翻译成我的母语:
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`
答案 0 :(得分:5)
使用case
之后的表达式检查when
后的表达式,如下所示:
daytime === (daytime.strftime('%A') == 'Monday')
# => nil
问题在于您尝试在daytime
之后将case
与nil
之后的when
进行比较。因此,如果所有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作为目标。
答案 1 :(得分:2)
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
答案 2 :(得分:0)
这是一个稍微紧凑的translate_date版本,如果daytime参数恰好是String,它也会转换为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