Ruby hat, wie Smalltalk, keine attribute. instanzvariablen sind nur innerhalb der klasse verfügbar und beginnen mit @. zugriffsmethoden gehen per attr_reader & friends. alles ist ein objekt, objekte haben nach außen nur methoden. vorteil: kapselung; nachteil: ein wenig mehr schreibarbeitMilan hat geschrieben:Es gibt in meinen Augen keinen Unterschied zwischen Methoden, Methodenaufrufen und Attributen.
ich verstehe bei deinem code gar nicht, zu was das x jetzt gehört. wann/wie oft wird x 1 zugewiesen? zu wem gehört x?
zu methoden ohne (): wie oft schreibt ihr () ohne inhalt? und wie oft braucht ihr die methoden selbst?
ich finde es gar nicht so schlimm, dass man in Ruby etwas mehr schreiben muss:
Code: Alles auswählen
foo.bar # methodenaufruf
foo.method(:bar) # methode
funktionale elemente (funktionen als parameter übergeben etc.) fallen in Ruby meist gar nicht auf, da vieles über codeblöcke läuft:
Code: Alles auswählen
[1, 2, 3].map { |x| x*x }
die redundanten klammern sind ganz grundlegend für Rubys syntax-logik. print zB ist ja auch nur eine methode...da hat ja auch Python keine klammern.
sehr seltsam. falls du mal schöneren code sehen willst, hier die appetithappen, die mich dazu gebracht haben, das buch zu kaufen und Ruby zu lernen:Dookie hat geschrieben:Aha, bei den Beispielen die ich zu Ruby fand, waren alle Methoden wie Foo.bar definiert
http://www.approximity.com/rubybuch2/node8.html
(hasattr? write ist ein attribut?)So kannst Du z.B. in Python mittesten ob foo eine write-Methode hat oder nicht.Code: Alles auswählen
if hasattr(foo, "write"): ...
in Ruby geht das natürlich auch:
Code: Alles auswählen
if foo.respond_to :write
...
lass mich raten: __hasattr__()?
module einzumischen und von klassen zu erben sind verschiedene dinge.Leonidas hat geschrieben:Man kann in Python inzwischen von jedem Typ erben. Warum fragst du um sinnvolle beispiele, wenn du dir einfach die sinnvollen Mixin Beispiele nehemen kannst?
geht auch int.methods() oder type(var) == int?Code: Alles auswählen
>>>type(true) <type 'bool'> >>>type(0) <type 'int'> >>>class myint(int):'
was benutzt man eigentlich in Python statt null oder nil? irgendein "nicht definiert" muss es doch geben...
meine frage bleibt: warum kein 'abc'.len()? wieso dieser seltsame umweg über __len__? das erweckt den eindruck, man würde mit einer definition von __len__ geheimnisvolle dinge tun, die Python unglaublicherweise ermöglicht. upper() ist doch auch eine echte methode (weil ja upper('abc') auf __upper__() umgeleitet wird.)Gute Frage, warum nicht? Das haben sich auch die Python Entwickler gedacht, deswegen macht len() genau das:Du siehst also das len() __len__() aufruft, das kannst du dann auch in deinen Klassen definieren und auch deine Klassen funktionieren dann mit len().Code: Alles auswählen
>>>len('abc') 3 >>>'abc'.__len__() 3
warum nicht auch len? ich will es ja nicht ändern, ich will bloß wissen, warum len() anders sein soll. die erfinder müssen sich doch was dabei gedacht haben.
von del fange ich lieber gar nicht erst an, das ist ja offenbar sogar ein keyword