【问题标题】:Floating loop in a sketchup pluginSketchUp 插件中的浮动循环
【发布时间】:2017-05-23 13:39:10
【问题描述】:

我需要在浮点上循环,但我没有找到正确的语法。 我尝试了什么:

(-1.0).upto(1.0).step(0.1) do |t|
    ...
end

我收到以下错误:

错误:#NoMethodError:未定义方法 `upto' for -1.0:Float>

编辑:是否有“好”或更好的方法来执行此循环?

【问题讨论】:

  • 这根本不是一个好主意,但这会起作用(除非你应该舍入你的浮点数):(-1.0..1.0).step(0.1).to_a.each { |e| e }
  • @yzalavin 为什么不是个好主意?有什么“好”的方法吗?
  • 否决票可以解释他们的原因吗?

标签: ruby sketchup


【解决方案1】:

一种选择是在Range 上使用步骤:

(-1.0..1.0).step(0.1) { |i|
  puts i
}

注意,当您以 0.1 递增时,您会遇到浮点精度问题。所以考虑到这一点。

-1.0
-0.9
-0.8
-0.7
-0.6
-0.5
-0.39999999999999997
-0.29999999999999993
-0.19999999999999996
-0.09999999999999995
5.551115123125783e-17
0.10000000000000006
0.20000000000000007
0.30000000000000004
0.4000000000000001
0.5000000000000001
0.6000000000000001
0.7000000000000001
0.8
0.9000000000000001
1.0

【讨论】:

    【解决方案2】:

    Float 没有 #upto 方法,但您可以创建自己的类似方法

    class Float
      def upto(target, options={})
        options = {step: 1.0}.merge(options)
        current_value = self
        while current_value < target
          yield current_value
          current_value += options[:step]
        end
      end
    end
    

    你可以这样做......

    (-1.0).upto(1.0, step: 0.1) do |t|
        ...
    end
    

    【讨论】:

    • 由于问题是在 SketchUp 的上下文中,表明他正在生成扩展,因此值得注意的是,托管在 SketchUp 扩展仓库上的扩展不允许修改 Ruby API 命名空间以避免冲突。相反,它必须将浮点数作为参数。
    猜你喜欢
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多