红宝石的范围可以从Float开始吗?

Mok*_*tar 2 ruby

我是红宝石的初学者,试图用它来帮助我分析生物数据.我需要尝试将一组数据(数组中的数字)与具有特定特异性的数据(例如数字+/- 0.25)相匹配我已经提出这个(到目前为止)将一个数据集更改为范围而不是数字:

def range(arr)
  c = []
  arr.each do |b|
    b = (b-0.25..b+0.25)
    b = b.to_a
    c << b
  end
  c = c.flatten
  return c
end
Run Code Online (Sandbox Code Playgroud)

代码给出了所需的数组,但我总是得到

TypeError: can't iterate from Float.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

背景

这是我的实际数据样本:

119.0456 119.0714 119.0721 119.0737 120.0772 130.0746 131.0737 136.0721 140.0951 143.0697 154.038 154.0744 154.1108 155.0949 156.054 169.053 170.1422 171.0646 171.0686 174.0644 174.0795 180.0539 182.1059

我需要将它与理论集匹配,我需要生成容差为0.002我正在逐步编写代码以生成我的理论集,因为我还是新编码,只是想知道如何在我的理论集合周围创建一个+/- 0.002的范围,以使其与实际的一致.

Ste*_*fan 10

红宝石的范围可以从Float开始吗?

是的,您可以使用浮点数创建范围:

r = 0.25..0.75
#=> 0.25..0.75
Run Code Online (Sandbox Code Playgroud)

但是你不能Range#each用来遍历它,因为each依赖succ(例如Integer#succ)并且Float没有实现该方法.

相反,您可以使用Range#stepwith explcit增量值:

r.step(0.1) { |f| puts f }
Run Code Online (Sandbox Code Playgroud)

输出:

0.25
0.35
0.45
0.55
0.65
0.75
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,让我们看看如果我们利用Float#next_float以下内容会发生什么:

class Float
  alias succ next_float
end

r = 0.25..0.75

r.each { |f| puts f }
Run Code Online (Sandbox Code Playgroud)

输出:

0.25
0.25000000000000006
0.2500000000000001
0.25000000000000017
0.2500000000000002
0.2500000000000003
0.25000000000000033
0.2500000000000004
0.25000000000000044
0.2500000000000005
0.25000000000000056
0.2500000000000006
...
Run Code Online (Sandbox Code Playgroud)

代码给出了所需的数组,但我总是得到

TypeError: can't iterate from Float.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题

您可以构建一个范围数组:

def range(arr)
  arr.map { |b| b-0.25..b+0.25 }
end

range [1, 2, 3]
#=> [0.75..1.25, 1.75..2.25, 2.75..3.25]
Run Code Online (Sandbox Code Playgroud)