2013-07-16 12 views
8

PHP Przykład:Czy Ruby obsługuje typ-podpowiedź?

function do_something(int $i) { 
    return $i + 2; 
} 

Ruby Przykład:

class MyClass 
    # ... 
end 

def do_something(MyClass x) 
    x.prop1 = "String..." 
end 

Czy jest coś podobnego do tego? Dzięki.

+2

Należy zauważyć, że php obsługuje funkcję typhinting tylko dla tablic i obiektów. '(int $ i)' niestety nie jest możliwe. Btw dlaczego spadki tutaj? Dla mnie, jako programisty PHP, jest to interesujące – hek2mgl

+0

Przepraszam, co? PHP nie obsługuje funkcji skalowania bez rozszerzenia trzeciej strony. – Hast

+1

@Hast niestety nie – hek2mgl

Odpowiedz

3

Ruby nie ma coś takiego, ale wszystko, co musisz zrobić, to dodać pojedynczą linię:

def do_something(x) 
    raise "Argument error blah blah" unless x.kind_of?(MyClass) 
    ... 
end 

Nie jest to wielka sprawa. Ale jeśli czujesz, że jest zbyt gadatliwy, a potem po prostu zdefiniować metodę:

module Kernel 
    def verify klass, arg 
    raise "Argument error blah blah" unless arg.kind_of?(klass) 
    end 
end 

i umieścić, że w pierwszej linii:

def do_something(x) 
    verify(MyClass, x) 
    ... 
end 
+1

Dla dokumentacji, takich jak stocznia, rdoc, istnieje specjalna składnia do określenia klasy argumentów. – sawa

+6

To zabawne "wszystko, co musisz zrobić, to napisać niestandardowy wyjątek dla każdego parametru w każdym wywołaniu funkcji" Naprawdę musiałem się śmiać :). Nie wiedziałem, że rubin jest czystym śmieciem, dopóki nie dowiedziałem się, że nie ma typowego podpowiedzi. Teraz na pewno nie będę zawracał sobie głowy tym językiem. – Toskan

+4

Oprócz kwestii estetycznych nie jest to semantycznie równoważne podpowiedziom typu. Co ważne, jest to sprawdzanie _runtime_ w porównaniu do podpowiedzi typu, co pozwala na "_statyczne_ sprawdzanie". To znaczy. Mogę natychmiast sprawdzić wszystkie ścieżki kodu, bez konieczności ich uruchamiania. Nie próbuję wyrzucać Rubiego, tylko wskazywanie na kontrole typu środowiska wykonawczego nie są równoważne. Jest to równoważne tylko z pełnym pokryciem testowym (wykracza poza "100% zasięgu": musi przetestować każdą stronę kodową, co jest czymś więcej niż tylko trafieniem na każdą linię syntaktyczną). to ... dość "wielka sprawa": P – hraban

3

Jeśli naprawdę chcesz, aby upewnić się pewna akcja jest wykonywana na wystąpienie określonej klasy (podobnie jak liczba całkowita), a następnie rozważyć zdefiniowania, że ​​działania na konkretnej klasy:

class Integer 
    def two_more 
    self + 2 
    end 
end 

3.two_more #=> 5 
2.0.two_more #=> undefined method `two_more' for 2.0:Float (NoMethodError) 

class MyClass 
    def do_something 
    self.prop1 = "String..." 
    end 
end 
+2

Która działa tylko dla * jednego * "parametru" (odbiornika), z powodu pojedynczej wysyłki. – user2246674

1

Nie, Sam Ruby nie go wesprzeć i myślę, nie jest to zamiarem Matza dodanie go do języka ... Ruby naprawdę obejmuje duck typing we własnym wewnętrznym API i czyni Ruby bardzo dynamicznym i produktywnym językiem ...

+9

Wszystko dobrze i dobrze, dopóki nie dojdziesz do złożonych systemów i argumenty muszą być zgodne z pewną implementacją. Ruby, jako świetny język - naprawdę mogłaby zrobić z taką funkcją. To świetna cecha niektórych z najlepszych języków OO :) – Oddman

2

Bezwstydna wtyczka - Właśnie opublikowałem rubinowy klejnot do tego - http://rubygems.org/gems/type_hinting

Użycie jest tutaj - https://github.com/beezee/ruby_type_hinting

Poszedłem najpierw i znalazłem ten wątek. Nie mogłem znaleźć tego, czego szukałem, więc napisałem to i doszedłem do wniosku, że będę się tym dzielić.

Myślę, że jest bardziej zwięzły niż jakiekolwiek z proponowanych rozwiązań tutaj, a także pozwala określić typ zwracanej metody.