Es geht nicht so sehr darum, dass die Methoden selbst etwas Besonderes sind, sondern eher darum, wie Ruby mit Zuweisungen umgeht (wie foo = bar
). Zuerst wird die rechte Seite ausgewertet, dann wird die linke Seite ausgewertet und die entsprechende Aktion durchgeführt. Handelt es sich bei der linken Seite um ein Objektattribut, so wird die entsprechende Setter-Methode aufgerufen.
In Ihrem Beispiel also:
Dummy.new.foo = 1 { |x| x }
Zunächst versucht Ruby, die Auswertung von 1 { |x| x }
was die Ursache für den Syntaxfehler ist.
Dummy.new.foo=something
bedeutet eigentlich nicht "Aufruf der Methode namens foo=
", bedeutet aber eigentlich eher etwas wie "evalualate something
und bestimmen dann, was `Dummy.new.foo
ist, und wenn es wie ein Objektattribut aussieht, fügen Sie =
an den Namen anhängen und diese Methode aufrufen". Dies ist der Grund Dummy.new.foo=
y Dummy.new.foo =
funktionieren beide auf die gleiche Weise.
Sie können diese Methoden aufrufen mit send
und kann damit einen Block übergeben:
Dummy.new.send "foo=", 2 do
puts "HI"
end
Der Grund dafür ist, dass mit send
können Sie die aufzurufende Methode explizit benennen.
Das Endergebnis ist natürlich, dass Methoden, die auf =
scheinen einige "besondere" Verhaltensweisen zu haben, die Sie beachten müssen, aber es könnte nützlich sein, zu verstehen, was tatsächlich vor sich geht.