通过不同因素操纵数组的元素,而不为每个元素创建变量

时间:2016-07-18 15:02:51

标签: arrays ruby sum

我想用不同的因素操纵数组的元素,然后求它们。

是否有更优雅的方式来编写此代码:

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"

我想知道是否有办法这样做而不像我一样为数组的每个元素创建一个变量。

5 个答案:

答案 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毫秒。
  • 请参阅类方法DateTime::strptime,对于strptime使用的格式字符串的键,请查看实例方法DateTime#strtime
  • 格式字符串中的
  • "%L"用于(零填充)毫秒。
  • DateTime.strptime(str << '0', fmt).to_time等于自纪元以来的秒数。
  • DateTime.strptime("00:00:00:000", fmt).to_time等于纪元与上一个午夜之间的秒数。因此,两个Time值之间的差异等于自上一个午夜以来经过的秒数。