2012-06-11 12 views

Respuesta

1

Primero, no hay Math.PI, es Math::PI --en este caso, use el que realmente funciona.

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

sin etc. son funciones, y se puede acceder de cualquier manera. Yo uso de puntos y notación, Math.sin(foo), porque es más fácil en los ojos (cuestión de opinión), y similar a cómo el código otros carriles está escrito canónicamente (como ActiveRecord de Rails findAll, por ejemplo, User.findAll), y como la mayoría de otros idiomas que utilizo regularmente hazlo.

Editar Oh, puedo haber entendido mal la pregunta.

0

Si recibo su pregunta correctamente, usted está preguntando por el tipo del valor que cos devuelve. En lugar de decirte de qué se trata, prefiero mostrarte una forma de comprobarlo por ti mismo.

irb(main):003:0>Math::cos(0.2).class 
=> Float 
irb(main):004:0> Math::PI.class 
=> Float 
8
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 
+0

bueno tener en cuenta que a pesar de Matemáticas :: PI puede ser flotante , puede promocionar PI a BigDecimal, señalando que 'tipo' es fungible (con reglas estrictas) en Ruby. – ChuckCottrill

0

Si include Math en su código, a continuación, puedes escribir:

PI 
cos(0.12) 

Necesitas prefijar Math sólo cuando Math no está incluido.

¿Has probado usar una gema envuelta alrededor del módulo Math? Mira la gema math_calculator. Eso te permitirá escribir tus expresiones normalmente, ej. "4 cos * pi * (0,12)" etc.

5

PI es una constante que pertenece al módulo de Math. Las constantes se accede a través del operador :::

Math::PI 

creo que se llama el alcance resolución operador. También puede resolver a métodos de clase, por lo que definitivamente se puede escribir:

Math::sin 

El operador punto envía mensajes a los objetos, que es una forma elegante de decir que llama métodos. PI es una constante, por lo que no puede acceder de esa manera. Math.PI es equivalente a Math.send :PI, que no funciona ya que Math no es respond_to? :PI. Por supuesto, usted puede arreglar eso:

def Math.PI 
    Math::PI 
end 

Math.PI 

Con method_missing, incluso se puede hacer que funcione con cualquier constante:

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

Math.PI 
Math.E 
Cuestiones relacionadas