Chcę zapytać o typ PI i cos z Ruby. Co to jest konwencja, aby pisać te typy?Jaki jest typ PI, cos w Ruby
Czy mogę napisać jak: Math::sin
, Math::PI
lub Math.sin
, Math.PI
?
Chcę zapytać o typ PI i cos z Ruby. Co to jest konwencja, aby pisać te typy?Jaki jest typ PI, cos w Ruby
Czy mogę napisać jak: Math::sin
, Math::PI
lub Math.sin
, Math.PI
?
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.
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
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
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
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
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