-
-
Save citizen428/2146609 to your computer and use it in GitHub Desktop.
module Kernel | |
def with(obj, &block) | |
obj.instance_eval &block | |
obj | |
end | |
end |
module Kernel | |
def with(obj, &block) | |
obj.instance_eval &block | |
obj | |
end | |
end | |
class Person | |
attr_accessor :name, :example | |
end | |
tester = with(Person.new) do | |
self.name = "Andy" | |
self.example = "Example" | |
end | |
puts "#{tester.name}:#{tester.example}" |
You can, but I prefer using setters/getters over directly manipulating instance vars.
Good point. But it's really interesting that the accessor methods are only available through self
, because if you define a method yourself like def hello; puts 'hello!'; end
it is available without self
. Do you know why?
Only the writers need to be qualified with self
, not the readers. The reason is simple: when Ruby encounters a bareword, it tries to resolve it as a local var. If there is none, it will try to call a method by that name. Inside the class body self
is the implicit receiver, so the reader works. Now for the writer there's a problem. If you write something like foo = "bar"
, Ruby will create a new local variable, hence you need to make the receiver explicit. Try defining a method like hello=
and you'll see that you'll also need the receiver for the same reason (unless of course you call it like hello=(value)
).
That makes sense. Thank you very much for explaining this in detail!
you could also use
@name = …
instead ofself.name = ...