Ruby - definiowanie typów

Witam, nie jestem nawet zielony w ruby, bo jeszcze mam wątpliwości, zanim zacznę poznawać ruby, to chciałbym je rozwiać.
W php denerwuje mnie to, jak i w JS, że nie można nadać obiektowi konkretnego typu. Na wikipedii na temat Ruby przeczytałem, że ruby też jest dynamicznie typowany.
Pytanie: czy obecnie da się zdefiniować typy obiektów? Jak zapewnić sobie rozwiązanie autocompletion podczas pisania (to wymaga informacji o danym typie).?

Nie rozumiem jak się ma autocompletion do statycznego typowania. Mógłbyś rozwinąc tę myśl?

IDE robią znacznie bardziej zaawansowane rzeczy niż dochodzenie do metod obiektu, którego typ nie jest zaznaczony w kodzie.

Jeśli interesuje Cię IDE do Ruby on Rails, to zobacz RubyMine.

To znaczy ja od razu powiem że na co dzień siedzę na platformie flex4 (as3). Jestem przyzwyczajony do takiej składni
public function foo(arg:String, arg2:Boolean):MyCustomClass
{
return anotherObject.getFoo(arg, arg2) as MyCustomClass
}

//

no i chciałbym w każdym momencie pisania kodu mieć łatwo przychodzącą świadomość typów każdego obiektu/membera/argumentu itd.

//no to może macie jakieś namiary na tutoriale migracyjne dla migracji z flex+php do flex+ruby

Też byłem kiedyś sceptyczny wobec dynamicznego typowania, ale wierz lub nie, w Rubym to działa. Większość programów i bibliotek jest napisana w ten sposób, że dokładnie wiesz jaki obiekt należy przekazać do funkcji. Zapominasz o typach, a zaczynasz myśleć o obiektach. Dzięki zwięzłości języka, zyskujesz na czytelności. np:

cat = Cat.new # nowy obiekt typu kot cat.feed_with(mouse) cat.feed_with(cheese)
Jeśli martwisz, się że podasz kotu coś niezdatnego do jedzenia, to przestań. Jeśli coś jest serem, lub myszą, to da się to zjeść i nie musisz definiować, że to jest jedzenie. Jeśli ktoś pisze

cheese = Poison.new # cheese to nowy obiekt typu trucizna cat.feed_with(cheese)
To robi to złośliwie. Ponieważ staramy sie by zmienne nazywały się poprawnie i senownie, to nikt trucizny nie nazwie serem. Jeśli dobrze nazwiesz zmienną to nie musisz się przejmowac jej typem, a dodatkowo masz dobrze nazwaną zmienną, co upraszcza zrozumienie kodu.

Naprawdę, przez kilka lat programowania w Rubym nie pamiętam, żebym miał jakieś większe problemy z niezgadzającymi się typami.

Do poczytania: http://en.wikipedia.org/wiki/Duck_typing

Dla skomplikowanych parametrów często w Rubym (a zwłaszcza w Railsach), stosuje się podawanie hasza z opcjami np:

persian = Race.new # nowa rasa cat = Cat.new( :color => 'black', :sex => 'female', :race => persian)
Dzięki czemu nie musisz pamiętać kolejności argumentów itp.

Chyba jednak będę się trzymał YARD, to zapewni ład duszy :smiley:

a powiedzmy czy jak bede mial tego RUBYMINE to da sie zrobic tak ze jak utworze w funkcji lokalną zmienną - instancję jakiegoś obiektu to będę miał autocompletion dla tego typu? Jak działa taki autocompletion skoro nie ma deklaracji obiektu, jest on tworzony w miejscu pierwszego użycia?

np jak utworze nową referencję do obiektu, który sobie wezmę pobierająć wartość zwróconą przez metodę innego obiektu, to czy autocompletion będzie śledził, skąd pobrałem wartość?

Nie wiem co się dzieje z tym forum. Wyświetlały mi się moje dwa identyczne posty, usunąłem jeden i nie ma żadnego :smiley:

Przeklejam:

[quote=zlw]Poza tym RubyMine (od wersji 3.2.*) obsługuje dobrze YARD.

[code=ruby]# @param [String] argument1

@param [Integer] argument2

@return [String]

def moja_metoda(argument1=’’, argument2=0)
“#{argument1} lala lala #{argument2}”
end[/code]
I wszystko Ci pięknie podpowie :slight_smile:

Nie chcę się chamsko reklamować, ale opisywałem to u siebie na blogu[/quote]
@borovsky Tak, będziesz miał :slight_smile:
http://img35.imageshack.us/img35/4306/rubymine.png

nie chcę co chwilę zakładać wątku, ale jak powiecie to zaloze.
Mam pytanie do ORM do mysql w ror. Interesuje mnie możliwość łatwego dodania nowej klasy/modyfikacji/usunięcia
prawdopodobnie tutaj też mamy do czynienia z plikami YML, tylko że w Doctrine dla PHP nie było takiej możliwości aby automatycznie tworzył on tabele/usuwał/modyfikował (dla tych klas)
jest jakieś wygodne api?

[quote=borovsky]nie chcę co chwilę zakładać wątku, ale jak powiecie to zaloze.
Mam pytanie do ORM do mysql w ror. Interesuje mnie możliwość łatwego dodania nowej klasy/modyfikacji/usunięcia
prawdopodobnie tutaj też mamy do czynienia z plikami YML, tylko że w Doctrine dla PHP nie było takiej możliwości aby automatycznie tworzył on tabele/usuwał/modyfikował (dla tych klas)
jest jakieś wygodne api?[/quote]
Zadales pytanie ktore jest stanowczo zbyt rozlegle zeby na nie sensownie odpowiedziec. Jezeli chcesz poznac rails i ORM ktory jest w nim domyslnie stosowany polecam

Załóż lepiej osobny temat, bo jak lewy313 powiedział - to zbyt rozległy temat :wink: