I saw this in a screencast and was just wondering what the '=' symbol does in this case.
def express_token=(token) ... end
I would understand if it were something like this -
def express_token(token = nil)
The above (second code snippet) means setting nil as the default value of the tokens parameter. However, in the first code snippet, '=' is outside the brackets.
That snippet defines a Virtual Attribute (or a "setter" method) so that "express_token" looks like an attribute, even though it's just the name of the method. For example:
class Foo def foo=(x) puts "OK: x=#{x}" end end f = Foo.new f.foo = 123 # => 123 # OK: x=123
Note that the object "f" has no attribute or instance variable named "foo" (nor does it need one), so the "foo=" method is just syntactic sugar for allowing a method call that looks like an assignment. Note also that such setter methods always return their argument, regardless of any return
statement or final value.
If you're defining a top-level setter method, for example, in "irb", then the behavior may be a little confusing because of the implicit addition of methods to the Object class. For example:
def bar=(y) puts "OK: y=#{y}" end bar = 123 # => 123, sets the variable "bar". bar # => 123 Object.new.bar = 123 # => 123, calls our method # OK: y=123 Object.public_methods.grep /bar/ # => ["bar="]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With