9

我想问一下 Ruby 的 PI 和 cos 的类型。编写这些类型的约定是什么?

我可以这样写:Math::sin,Math::PIMath.sin,Math.PI吗?

4

5 回答 5

11
puts Math::PI
#=> 3.141592653589793
include Math
puts PI.class
#=> Float
require "bigdecimal/math"
include BigMath
puts PI(50).class
#=> BigDecimal
puts PI(50)
#=> 0.3141592653589793238462643383279502884197169399375105820974944592309049629352442819E1
于 2012-06-11T12:24:31.287 回答
10

PI是属于模块的常数。Math常量通过::操作符访问:

Math::PI

我相信它被称为范围解析运算符。它还可以解析为类方法,因此您绝对可以编写:

Math::sin

点运算符向对象发送消息,这是一种称它调用方法的奇特方式。PI是一个常数,所以你不能那样访问它。Math.PI等价于Math.send :PI,它不起作用,因为Mathnot respond_to? :PI。当然,你可以解决这个问题:

def Math.PI
  Math::PI
end

Math.PI

使用method_missing,您甚至可以使其与任何常量一起工作:

def Math.method_missing(method, *arguments, &block)
  Math.const_get method, *arguments, &block
end

Math.PI
Math.E
于 2012-06-11T13:28:04.227 回答
2

首先,没有Math.PI,它是Math::PI-- 在这种情况下,使用实际工作的那个。

[1] pry(main)> Math.PI
NoMethodError: undefined method `PI' for Math:Module
[2] pry(main)> Math::PI
=> 3.141592653589793

sin等是函数,可以通过任何一种方式访问​​。我使用点表示法, Math.sin(foo), 因为它看起来更容易(见仁见智),并且类似于其他 Rails 代码的规范编写方式(如 Rails 的 ActiveRecord findAll,例如User.findAll),以及我经常使用的大多数其他语言的方式。

编辑哦,我可能误解了这个问题。

于 2012-06-11T12:12:38.887 回答
0

如果我的问题是正确的,那么您是在询问 cos 返回的值的类型。与其告诉你它是什么,我更愿意向你展示一种自己检查它的方法。

irb(main):003:0>Math::cos(0.2).class
=> Float
irb(main):004:0> Math::PI.class
=> Float
于 2012-06-11T12:14:58.940 回答
0

如果你include Math在你的代码中,那么你可以写:

PI
cos(0.12)

Math仅当Math不包括在内时才需要前缀。

您是否尝试过使用包裹在 Math 模块周围的 gem?查看 math_calculator gem。这将允许您正常编写表达式,例如。“4*pi*cos(0.12)”等

于 2012-06-11T12:56:09.947 回答