我想用不同的因素操纵数组的元素,然后求它们。
是否有更优雅的方式来编写此代码:
test = '02:30:09:00'
test2 = test.split(':')
t1 = test2[0].to_i * 3600
t2 = test2[1].to_i * 60
t3 = test2[2].to_i
t4 = test2[3].to_i
dur = t1 + t2 + t3 + t4
p "#{dur} seconds"
我想知道是否有办法这样做而不像我一样为数组的每个元素创建一个变量。
答案 0 :(得分:2)
那么,不要创建变量
dur = test2[0].to_i * 3600 + test2[1].to_i * 60 + ...
虽然,我发现用说话名称提取变量通常会提高可读性。关键字是:“说出名字”。比较:
hours_in_secs = time_parts[0].to_i * 3600
minutes_in_secs = time_parts[1].to_i * 60
seconds = time_parts[2].to_i
duration_in_seconds = hours_in_secs + minutes_in_secs + seconds
答案 1 :(得分:1)
为了提高可读性,请考虑提取方法,如:
def seconds_amount(hours, minutes, seconds, cents)
hours.to_i * 3600 + minutes.to_i * 60 + seconds.to_i + cents.to_f / 100
end
test = '02:30:09:00'
test2 = test.split(':')
puts seconds_amount(*test2)
# => 9009
Ruby中的新变量通常不是一个大问题 - 它不会分配额外的内存,变量只是指向同一对象的指针。
答案 2 :(得分:1)
'02:30:09:00'.split(":").zip([3600, 60, 1, 1])
.inject(0){|dur, (s, factor)| dur + s.to_i * factor}
# => 9009
答案 3 :(得分:0)
我只是尝试一些lambda。
test = '02:30:09:00'
dur = test.split(':').zip([3600, 60, 1, 1]).map(&->(s, i){ s.to_i * i }).inject(:+)
p "#{dur} seconds"
# => "9009 seconds"
答案 4 :(得分:0)
require 'time'
str = '02:30:09:12'
fmt = "%H:%M:%S:%L"
seconds = DateTime.strptime(str << '0', fmt).to_time -
DateTime.strptime("00:00:00:000", fmt).to_time
#=> 9009.12
"12"
,我从"00"
更改为更有趣)是百分之一秒。 '02:30:09:12' << '0' #=> "02:30:09:120"
将12
百分之一秒转换为120
毫秒。strptime
使用的格式字符串的键,请查看实例方法DateTime#strtime。 "%L"
用于(零填充)毫秒。DateTime.strptime(str << '0', fmt).to_time
等于自纪元以来的秒数。DateTime.strptime("00:00:00:000", fmt).to_time
等于纪元与上一个午夜之间的秒数。因此,两个Time
值之间的差异等于自上一个午夜以来经过的秒数。