2012-06-11 12 views

Odpowiedz

1

Po pierwsze, nie ma Math.PI, to jest Math::PI - w tym przypadku użyj tego, który faktycznie działa.

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

sin itp są funkcje i mogą być dostępne w obu kierunkach. Używam dot-notation, Math.sin(foo), ponieważ jest to łatwiejsze w oczach (kwestia opinii) i podobne do tego, w jaki sposób inny kod Railsowy jest pisany kanonicznie (jak ActiveRecord Railsów findAll, np. User.findAll) i jak większość innych języków używam regularnie Zrób to.

Edytuj Och, prawdopodobnie źle zrozumiałem to pytanie.

0

Jeśli otrzymam poprawnie pytanie, pytasz o typ wartości, która zwraca. Zamiast tego, mówiąc ci, co to jest, wolę pokazać ci sposób, aby to sprawdzić.

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

Warto zauważyć, że chociaż Math :: PI może być pływak , możesz promować PI do BigDecimal, wskazując, że "typ" jest zamienny (z surowymi regułami) w Ruby. – ChuckCottrill

0

Jeśli include Math w kodzie, to można po prostu napisać:

PI 
cos(0.12) 

trzeba poprzedzić Math tylko gdy Math nie jest włączone.

Czy próbowałeś użyć klejnotu owiniętego wokół modułu Math? Sprawdź gem gem math_calculator. Umożliwi to normalne pisanie wyrażeń, np. "4 * pi * cos (0,12)" itd

5

PI jest stałe należący do modułu Math. Stałe są dostępne za pośrednictwem operatora :::

Math::PI 

Uważam, że nazywa się zakres rozdzielczości operator. Można go również rozwiązać do metod klasy, więc można z pewnością napisać:

Math::sin 

Operator kropka wysyła wiadomości do obiektów, które to fantazyjny sposób mówiąc, że wywołuje metody. PI jest stałą, więc nie można uzyskać do niej dostępu w ten sposób. Math.PI jest odpowiednikiem Math.send :PI, który nie działa od Math, nie jest respond_to? :PI. Oczywiście, może naprawić:

def Math.PI 
    Math::PI 
end 

Math.PI 

Z method_missing, można nawet zrobić to praca z żadnego Constant:

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

Math.PI 
Math.E