查看完整版本: 黑马,请教个问题

alanyuqiang 2008-7-27 17:51

黑马,请教个问题

这是一帖里同学的问题,理解了下,不知道对不对
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
你怎么解释?

刀光剑影 2008-7-27 18:10

类不能直接调用实例方法.实例方法(实例里进行访问).[code]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[/code]

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

alanyuqiang 2008-7-27 18:52

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

刀光剑影 2008-7-27 19:32

我都说了 类不能直接调用实例方法。
你的 实例方法需要实例里进行访问
你 上面写的 那个你 自己试了吗。能那样调用吗?[code]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> [/code]

alanyuqiang 2008-7-27 19:39

333333333333333333333333333

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

alanyuqiang 2008-7-27 19:43

[quote]原帖由 [i]刀光剑影[/i] 于 2008-7-27 18:10 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=18381&ptid=5828][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
类不能直接调用实例方法.实例方法(实例里进行访问).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 ... [/quote]
你说类不能直接调用实例方法,那你的意思是说我在类中调用a是==类直接调用实例方法,而又因为类不能直接调用实例方法,所以出错。
我的疑问就是在类中调用a是==类直接调用实例方法?
是这个意思,并不是说类可以直接调用实例方法。

alanyuqiang 2008-7-27 19:48

[quote]原帖由 [i]刀光剑影[/i] 于 2008-7-27 19:32 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=18386&ptid=5828][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
我都说了 类不能直接调用实例方法。
你的 实例方法需要实例里进行访问
你 上面写的 那个你 自己试了吗。能那样调用吗?irb(main):001:0> class AAA
irb(main):002:1> def a
irb(main):003:2> puts "a"
irb(main ... [/quote]
class AAA
def a
  puts "a"
end
end
AAA.a
我这样写并不是说类可以调用实例方法,而是你说我上面写的代码是因为“类不能直接调用实例方法”而出错的。那这样你的意思就是说我上面的代码相当于“在类中调用实例方法”而所以会出错,对吧。
假如这个结论是对的,那怎么self后再类中可以调用?

刀光剑影 2008-7-27 19:48

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

alanyuqiang 2008-7-27 19:51

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

刀光剑影 2008-7-27 19:55

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

alanyuqiang 2008-7-27 20:12

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")
晕死,这样基础的。

刀光剑影 2008-7-27 20:17

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

alanyuqiang 2008-7-27 20:22

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

刀光剑影 2008-7-27 21:10

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

alanyuqiang 2008-7-27 21:26

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

alanyuqiang 2008-7-27 21:36

搞清楚了,答案是:
class AAA
def b
puts "b"
end
b
end
相当于
class AAA
def b
puts "b"
end
self.b
end
在这谢谢群里的张兄。

黑马 2008-7-28 01:26

参考我另外一篇贴子,ruby基础中的 A.10  面向对象
请记住,"ruby中几乎一切是对象"--真的请记住--类的定义体本身也是对象--用这句话来去思考你上面所发现的问题!

alanyuqiang 2008-7-28 17:20

黑马,一言点醒我很多,可能我现在理解的也不完全对。望指教。
class AAA
def b
puts "b"
end
b
end
类的定义体本身也是对象。
也就是说我的类AAA是Class的一个实例对象,在AAA中调用的方法都是必须在Class中已经定义过的,且是public的;否则会报不存在这一方法。
如上面的例子,我要在AAA中调用b的话,则需要在:
class Class
  def b
    puts "b in Class"
  end
end。
OK。谢谢黑马。

hello123 2008-7-28 19:43

alanyuqiang是弱智啊.说这麽清楚还不明白.看了你的一些回复.连方法的接受者和发送者都搞不清楚.就单看你这一个回答我就知道你的水平怎么样.调用都没搞清楚.
ruby的语法很简单.了解个皮毛很容易.要真正用好不是一天天的事情.要学的东西很多.塌实点吧.....

alanyuqiang 2008-7-28 20:23

[quote]原帖由 [i]hello123[/i] 于 2008-7-28 19:43 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=18446&ptid=5828][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
alanyuqiang是弱智啊.说这麽清楚还不明白.看了你的一些回复.连方法的接受者和发送者都搞不清楚.就单看你这一个回答我就知道你的水平怎么样.调用都没搞清楚.
ruby的语法很简单.了解个皮毛很容易.要真正用好不 ... [/quote]
ruby的语法很简单?“高手”,真是“高手”。居然说ruby的语法简单。
你认为管理员的答案跟黑马的答案一样吗?
水平差?算,不跟你计较。
姑且算我水平差。有不同意见我这个人是肯定要提的。不会因为说出去被别人笑。你水平高?没看出来啊,也姑且你水平高。量你现在混的也不怎么样。一,人品,动不动就这骂那骂,二,真正有水平的不会搞人声攻击,三,真正有水平的遇到我这样“水平低的”会耐心教。
所以推断,你这个“有水平的”最多也就拿几千工资在那唱“老子天下第一”。
强烈BS你。
有意见-----------提。这是讲道理的地方。但请你这个“有水平”的“高手”记住:这不是骂人的地方。要骂人,回家去。

[[i] 本帖最后由 alanyuqiang 于 2008-7-28 20:34 编辑 [/i]]

黑马 2008-7-28 20:37

不要吵了,,聪明和笨都不是问题,高手和新手也不是问题,
问题是---用心去学
类的定义体是可执行代码,
他的运行环境即是在Class对象中,Class继承了什么类,mixin了什么module,的实例方法都可在Class中的对象中使用.当然,你也可以为Class,Object等类补充方法,以实现在这些类中得到继承

Ruby的语法"简单"而又"复杂",很多方面很诡异.需要去挖挖考搞明白和用的好的.

alanyuqiang 2008-7-28 20:40

谢谢黑马,我没有要跟他吵,只是觉得他不是太会处事。网络上跟现实中其实处事都是一样的,做事难,处事更有哲学。
再次谢谢黑马和管理员

刀光剑影 2008-7-28 21:44

.....有吵的时间,又看好几个知识点了.
多去思考,多去理解.
问,问题的时候引导他人很乐意的为你解答问题.这才是最聪明的做法...

黑马 2008-7-29 00:43

[quote]原帖由 [i]alanyuqiang[/i] 于 2008-7-27 21:26 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=18398&ptid=5828][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
那我请问管理员:
class AAA
def self.b
puts "b"
end
b
end
这个你怎么解释,是可以运行的。输出b [/quote]
b 这行可以理解为 self.b再看看和你的定义体有区别嘛?为什么不可以调用?
这里面两层概念,一是能不能调用,二是定义体本身发生了执行.

hello123 2008-7-29 07:29

alanyuqiang懒得跟你争,我那样说是我看不惯你那种不谦虚的态度.你去看看你自己的回贴和别人的回贴.我说我1个月拿上万,拿几千有什么意义,你水平高就一定你拿的多吗?你水平低你就一定你拿的少吗?现实中人比人气死人这样的事情太多了,不平衡的事情也太多了.还用我在举例嘛.

我说简单是因为ruby语法本身很简单.很容易学.
但用的好不是一两天的事情.ruby是一门动态的语言.非常灵活.细小的东西很多.

alanyuqiang 2008-7-29 09:15

[quote]原帖由 [i]hello123[/i] 于 2008-7-29 07:29 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=18475&ptid=5828][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
alanyuqiang懒得跟你争,我那样说是我看不惯你那种不谦虚的态度.你去看看你自己的回贴和别人的回贴.我说我1个月拿上万,拿几千有什么意义,你水平高就一定你拿的多吗?你水平低你就一定你拿的少吗?现实中人比人气 ... [/quote]
首先,懒得跟我争就不会回帖了,自相矛盾;其次,我的态度不会不谦虚,只是在我遇到问题跟别人不统一时我一定去据理力争,为问题而争吵我觉得很正常。
你去看看你的回帖,你觉得你做好了吗?你敬重别人,自然别人也敬重你。你的第一个帖子不是探讨问题,而是骂别人。如此确实可见一斑。
算了,如果我的态度不够好,在这向管理员道歉。在这帖子里我不会再回帖了。

drive2me 2008-7-29 19:19

analnyuqiang,

你是我们的会员,应该在论坛里得到尊重的。
我们的版主有说话不档的地方,和不耐心,我向你道歉。请你接受。

我刚看到这些帖子,来晚了。不过,还是要向你道歉。

说实话,今天你是ROR的新手,努力学习和掌握,明天就是高手。但也可能在其它语言里,你就是高手。我们尊重每一位会员,因为软件行业很大,涉及到技术和知识很多,不是每一个人都有时间和精力可以掌握的。所以,我们的工程师,设计师,架构师都有他们自己的特长,只不过暂时不太了解ROR,来这里和大家一起学习。

所以,我们的所有版主应该了解这些,耐心帮助我们的会员掌握ROR。
我们还要加强对管理员的管理和教育,使他们能更好地服务大家。

谢谢你的意见。
页: [1]
查看完整版本: 黑马,请教个问题