Google 网上论坛不再支持新的 Usenet 帖子或订阅项。历史内容仍可供查看。

When are attr_reader type methods called?

已查看 0 次
跳至第一个未读帖子

Vivek

未读,
2005年12月20日 23:09:332005/12/20
收件人
I couldnt get a proper subject for the post but here is my question.
Its regarding methods like
attr_reader defined like below
You can do this in ruby

# file a.rb
class A
call_this ("hello world")

def call_this
....
end
end


The A::call_this is called immediately after I run the script.Becuase I
made the method print something and it printed it even though I hadnt
instantiated an object of the class with new.
What if the method uses some instance variables? wouldnt that be a
problem because its called even before an object is created?My question
is at what time during program execution are these methods called? If
there are more than one classes in a file then whats the order ? is it
defined by the language?
My guess is that these are like the equivalent of static member
variables in C, initialized before _main is called.?
Hope to get some clarification on this
vivek

Patrick Hurley

未读,
2005年12月20日 23:36:262005/12/20
收件人

Actually your code will generate an error. You can do this:

class Foo
def self.bar
puts 42
end

bar
end

This will work as the method bar exists and belongs to the class Foo,
not an instance of Foo. This will not work:

class Boo
def hoo
puts "Python is nice, but I like Ruby better :-)"
end

hoo # this will raise a NoMethodError, unless hoo had been
defined further up the chain
end

Of course you can work around much of this with fun method_missing
maddness. In the particular case of attr_reader, they are actually
part of Module which is the superclass of Class, that is why you can
call them inside your class definitions -- they are methods available
in Class (and you are defining a Class).

pth


Daniel Sheppard

未读,
2005年12月20日 23:48:262005/12/20
收件人
class A
call_this ("hello world")
def call_this(arg)
p arg
end
end

gives me

NoMethodError: undefined method `call_this' for A:Class
from (irb):3

So you're obviously doing something more than just what you posted -
what's in the ...?

class A
attr_reader :monkeys
end

is roughly equivalent to writing:

A = Class.new
A.define_method :monkeys {
instance_variable_get(:@monkeys)
}

Is that what you're asking? Try posting a short piece of code with
actual and expected outputs.

#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################
#####################################################################################
This e-mail message has been scanned for Viruses and Content and cleared
by NetIQ MailMarshal
#####################################################################################


Ross Bamford

未读,
2005年12月21日 00:03:402005/12/21
收件人
On Wed, 21 Dec 2005 04:09:33 -0000, Vivek <krishn...@gmail.com> wrote:

> I couldnt get a proper subject for the post but here is my question.
> Its regarding methods like
> attr_reader defined like below
> You can do this in ruby
>
> # file a.rb
> class A
> call_this ("hello world")
>
> def call_this
> ....
> end
> end
>
>
> The A::call_this is called immediately after I run the script.Becuase I
> made the method print something and it printed it even though I hadnt
> instantiated an object of the class with new.
> What if the method uses some instance variables? wouldnt that be a
> problem because its called even before an object is created?My question
> is at what time during program execution are these methods called? If
> there are more than one classes in a file then whats the order ? is it
> defined by the language?

It's top to bottom, as you'd expect. Does the following surprise you?

NewClass = Class.new(Array) do

attr_accessor :myattr

def this
"that"
end
end

puts (nc = NewClass.new).this
nc.myattr = 16
puts nc.myattr

nc[3] = "Aha!"
p nc

I just made a new nuby file trying out the attr_accessor and instance var
stuff you asked about:

http://roscopeco.co.uk/code/noob/class-def.html

--
Ross Bamford - ro...@roscopeco.remove.co.uk

Vivek

未读,
2005年12月22日 04:05:312005/12/22
收件人
Ok ..sorry for the wrong code.What I meant was do have a class
method.Thanks for the explanation ..so now I have this below (I learnt
the instance_eval from Ross' examples)

class X
@ivar = 1
def self.call_this
puts "call this"
@var = 1
end
end
class A <X
call_this
def some_method(arg)
puts arg
end
end
puts X.instance_eval { @var}
puts X.instance_eval { @ivar}


So I execute the above program and call_this is called. So I guess
these methods which are called in a class but outside any function have
to be class methods and are called in a sequential order as they are
encountered by the interpreter.
This brings me to another question
I have a statement like @var = 1 inside a class method 'call_this'
,but @var is an instance variable,so who come I dont get an error?
Although when I try to print it out it gives 'nil' .Is this some thing
which ruby forgives ?

And second
I read the documentation of instance_eval at The practical programmer
site..which says.

instance_eval obj.instance_eval(aString [, file [ line ] ] ) ->
anObject

But here and in Ross' examples we call it on a class ? Is the
documentation incorrect or am i missing something.

thanks again
vivek

Patrick Hurley

未读,
2005年12月22日 05:05:442005/12/22
收件人
On 12/22/05, Vivek <krishn...@gmail.com> wrote:
> class X
> @ivar = 1
> def self.call_this
> puts "call this"
> @var = 1
> end
> end
> class A <X
> call_this
> def some_method(arg)
> puts arg
> end
> end
> puts X.instance_eval { @var}
> puts X.instance_eval { @ivar}
>
>
> I have a statement like @var = 1 inside a class method 'call_this'
> ,but @var is an instance variable,so who come I dont get an error?

You are asking the right questions, if you are feeling adventurous do a quick:
ri Class

X is also an Object -- the variable @ivar is an instance variable in
that class. Similarly the instance variable @var you create in the
call_this method, becomes an instance variable in the class A. Try
this:

puts A.instance_eval { @var } # -> 1

Also note that if you:

X.call_this
puts X.instance_eval { @var } # -> 1

> And second
> I read the documentation of instance_eval at The practical programmer
> site..which says.
>
> instance_eval obj.instance_eval(aString [, file [ line ] ] ) ->
> anObject
>
> But here and in Ross' examples we call it on a class ? Is the
> documentation incorrect or am i missing something.

You were (because I know you got it from my pitiful explanation :-)
were missing that a Class is an Object.

Good Luck and keep at it
pth


Ross Bamford

未读,
2005年12月22日 08:22:472005/12/22
收件人
On Thu, 22 Dec 2005 10:05:44 -0000, Patrick Hurley <phu...@gmail.com>
wrote:

(OP:) See also my 'Eureka' moment:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/167586 .

I have a feeling you're not far from discovering Ruby magic - stick with
it :)

0 个新帖子