我在Ruby中遇到了DateTime的问题 我有这样的行(它在.txt文件中)
DateTime.new(1979,1,1) DateTime.new(2012,3,29)
我的功能看起来像这样
def split_line
array = line.split(' ')
@date_of_birth = array[0]
@date_of_death = array[1]
end
但是@date_of_birth
和@date_of_death
类是String。我怎样才能将它们作为DateTime?
答案 0 :(得分:0)
假设您的字符串格式正确,那么您可能正在寻找:
call echo %%select%%
有关详细信息,请参阅此处:
答案 1 :(得分:0)
这:
DateTime.new(1979,1,1) DateTime.new(2012,3,29)
不是代码。你期望这样做什么?
如果您想要两个DateTimes
作为空格分隔的字符串,请执行以下操作:
"#{DateTime.new(1979,1,1)} #{DateTime.new(2012,3,29)}"
当你在一组双引号内有#{...}
之类的东西时(必须是双引号而不是单引号),它被称为string interpolation
。学习它。爱它。住它。
但是,对于我的生活,我不知道你为什么不这样做:
[DateTime.new(1979,1,1), DateTime.new(2012,3,29)]
这会为您提供array
,因此不需要split
。只是:
def split_line
@date_of_birth = array[0]
@date_of_death = array[1]
end
答案 2 :(得分:0)
如果您想要DateTime值,请抓取数字并创建它们:
require 'date'
'DateTime.new(1979,1,1) DateTime.new(2012,3,29)'.split.map { |s|
DateTime.new(*s.scan(/\d+/).map(&:to_i) )
}
# => [#<DateTime: 1979-01-01T00:00:00+00:00 ((2443875j,0s,0n),+0s,2299161j)>,
# #<DateTime: 2012-03-29T00:00:00+00:00 ((2456016j,0s,0n),+0s,2299161j)>]
值不是DateTime,它们是日期:
'DateTime.new(1979,1,1) DateTime.new(2012,3,29)'.split.map { |s|
Date.new(*s.scan(/\d+/).map(&:to_i) )
}
# => [#<Date: 1979-01-01 ((2443875j,0s,0n),+0s,2299161j)>,
# #<Date: 2012-03-29 ((2456016j,0s,0n),+0s,2299161j)>]
打破它:
'DateTime.new(1979,1,1) DateTime.new(2012,3,29)'.split # => ["DateTime.new(1979,1,1)", "DateTime.new(2012,3,29)"]
.map { |s|
Date.new(
*s.scan(/\d+/) # => ["1979", "1", "1"], ["2012", "3", "29"]
.map(&:to_i) # => [1979, 1, 1], [2012, 3, 29]
)
}
# => [#<Date: 1979-01-01 ((2443875j,0s,0n),+0s,2299161j)>,
# #<Date: 2012-03-29 ((2456016j,0s,0n),+0s,2299161j)>]
像这样使用的 *
(AKA“splat”)会将数组分解为其元素,这在有数组时非常有用,但该方法只需要单独的参数。
更大的问题是为什么你在文本文件中获得这样的值。