打印

黑马,请教个问题

黑马,请教个问题

这是一帖里同学的问题,理解了下,不知道对不对
class AAA
 def b
 puts "b"
 end
 b
end
上面的程序会出错,在运行过程中会说“undefined local variable or method `b' for AAA:Class (NameError)”
当时我想是因为定义的b是实例方法,故在这调用会出错。
所以我认为如果要在这调用则要这样:
class AAA
 def self.b
 puts "b"
 end
 b
end
你怎么解释?

TOP

类不能直接调用实例方法.实例方法(实例里进行访问).

C:\>irb
irb(main):001:0> class A
irb(main):002:1> def b
irb(main):003:2> puts "b"
irb(main):004:2> end
irb(main):005:1> a=A.new
irb(main):006:1> a.b
irb(main):007:1> end
b
=> nil


[ 本帖最后由 刀光剑影 于 2008-7-27 18:27 编辑 ]

TOP

你说的我知道,但我在类里面调用方法是你说的“类直接调用实例方法”么?按照你说的,如:
class AAA
 def a
  puts "a"
 end
end
AAA.a
这样才是类直接调用实例方法,我上面第一个例子是属于“类直接调用方法么”。因为按照一般的思维,你定义了一个方法,在类中都是可以调用的。
还有一个问题,实例方法在这不能调用,怎么self后即类方法在这可以调用。
如果真是你说的,在类定义里面调用实例方法==AAA.a的话,这样也能解释类定义时可以直接调用self方法,因为这样也就等于AAA.self方法。
现在问题应该就是“类定义里面调用实例方法是否==AAA.a”??

TOP

我都说了 类不能直接调用实例方法。
你的 实例方法需要实例里进行访问
你 上面写的 那个你 自己试了吗。能那样调用吗?

irb(main):001:0> class AAA
irb(main):002:1> def a
irb(main):003:2> puts "a"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> AAA.a
NoMethodError: undefined method `a' for AAA:Class
	from (irb):6
	from :0
irb(main):007:0> 


TOP

333333333333333333333333333

[ 本帖最后由 alanyuqiang 于 2008-7-27 19:43 编辑 ]

TOP

引用:
原帖由 刀光剑影 于 2008-7-27 18:10 发表
类不能直接调用实例方法.实例方法(实例里进行访问).C:\>irb
irb(main):001:0> class A
irb(main):002:1> def b
irb(main):003:2> puts "b"
irb(main):004:2> end
irb(main):005:1> a=A.new
irb(main):006:1> a ...
你说类不能直接调用实例方法,那你的意思是说我在类中调用a是==类直接调用实例方法,而又因为类不能直接调用实例方法,所以出错。
我的疑问就是在类中调用a是==类直接调用实例方法?
是这个意思,并不是说类可以直接调用实例方法。

TOP

引用:
原帖由 刀光剑影 于 2008-7-27 19:32 发表
我都说了 类不能直接调用实例方法。
你的 实例方法需要实例里进行访问
你 上面写的 那个你 自己试了吗。能那样调用吗?irb(main):001:0> class AAA
irb(main):002:1> def a
irb(main):003:2> puts "a"
irb(main ...
class AAA
def a
 puts "a"
end
end
AAA.a
我这样写并不是说类可以调用实例方法,而是你说我上面写的代码是因为“类不能直接调用实例方法”而出错的。那这样你的意思就是说我上面的代码相当于“在类中调用实例方法”而所以会出错,对吧。
假如这个结论是对的,那怎么self后再类中可以调用?

TOP

self.a是实例方法吗???
你好好想想。

TOP

管理员,你没看清我的问题。是你最先理解错了。我知道什么是实例方法,什么是类方法,这些概念我一清二楚。可能我表达的不准确吧

TOP

你都清楚了。那你说说他们的区别,都有那些访问方式。你写个实际的代码列一下。

TOP

class AAA
def method1----------------------实例方法
 puts "method1"
end
 
def self.method2---------------类方法
 puts ""
end
 或者
 def AAA.method2
  puts ""
 end
end
调用的时候
AAA.method2
aaa=AAA.new
aaa.method1或者method("method1").call或者aaa.send("method1")
晕死,这样基础的。

TOP

是很基础没错。你自己看看你列全了 吗?他们的 根本区别你 说到了吗?

TOP

区别太多了,我觉得这样争下去没意思。我只是对我的问题,感到疑惑。而不是说我现在懂得了多少。
看谁能帮我解答一下

TOP

我不说了哎。自己好好理解下。
下次发贴的时候,代码尽量写到code里,工整点,格式清晰一些,别人看的 时候也 容易看,尽量写完整,自己试过了,验证过了在发。

TOP

那我请问管理员:
class AAA
def self.b
puts "b"
end
b
end
这个你怎么解释,是可以运行的。输出b

TOP

2008-12-02 11:25 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61