[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

using self.attribute for writing vs reading - confusion

Aryk Grosz

4/13/2007 2:28:00 AM

Lets take this simple example

class NewBook

attr_accessor :books

def initialize
@books = []
end

def some_method
books[0] #( the reader for books works fine and will recall the
class value @books, however)

books = [4,5,6,7] # ( books will not actually get assigned here
unless I do self.books = [4,5,6,7] )
end

end


Why do you have to use self.books= on writer methods, but you can simply
put books on reader method.

Very confused. Any help would be great.

--
Posted via http://www.ruby-....

2 Answers

jg.ruby

4/13/2007 2:54:00 AM

0

On Apr 12, 10:28 pm, Aryk Grosz <tennisbum2...@hotmail.com> wrote:
> Lets take this simple example
>
> class NewBook
>
> attr_accessor :books
>
> def initialize
> @books = []
> end
>
> def some_method
> books[0] #( the reader for books works fine and will recall the
> class value @books, however)
>
> books = [4,5,6,7] # ( books will not actually get assigned here
> unless I do self.books = [4,5,6,7] )
> end
>
> end
>
> Why do you have to use self.books= on writer methods, but you can simply
> put books on reader method.
>
> Very confused. Any help would be great.
>
> --
> Posted viahttp://www.ruby-....

In the case of "books = foo", ruby thinks books is a new locally
scoped variable. It's a ruby language "gotcha". To inform ruby that
you want to call the "book=" method on your object, you have to
explicitly mention the reciever: "self.book = foo"

OR, as long as you are in an instance method of that class, you can
just access the instance variable directly: "@book = foo"

Gary Wright

4/13/2007 2:57:00 AM

0


On Apr 12, 2007, at 10:28 PM, Aryk Grosz wrote:
> Why do you have to use self.books= on writer methods, but you can
> simply
> put books on reader method.


books = [1,2,3,4]
list = [5,6,7,8]

Which one is a setter method and which one is an assignment
to a local variable?

You have to use self.books so that the parser can
distinguish between a call to the setter method
and a local variable assignment. This is a side effect of
their being no need to declare local variables nor a sigil
for local variables (like @ and $ for instance and global
variables).


Gary Wright