浏览 4397 次
锁定老帖子 主题:请教irb与正式运行ruby时的不同之处?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-18
--------------- def say p "hello" end a = 1 a.say --------------- 运行之 a.rb:5: private method `say' called for 1:Fixnum (NoMethodError) (报错合理,say方法是Object类的私有实例方法) 二, 在irb下运行: --------------- irb(main):001:0> def say irb(main):002:1> p "hello" irb(main):003:1> end => nil irb(main):004:0> a = 1 => 1 irb(main):005:0> a.say "hello" => nil --------------- (这里迷惑之,为什么a能调用say方法呢?) 继续运行 irb(main):023:0> puts Object.public_instance_methods.sort 发现say方法竟然在Object公共实例方法里面。 请问有没人能解释一下,irb和正式运行ruby时一些细致的区别 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-09-18
自己跟个贴
修改a.rb文件代码如下: --------------- public def say p "hello" end a = 1 a.say --------------- 运行之,正常显示 hello 由此推测irb运行时默认添加了一句public 呵呵,看来要看看irb相关文档了 |
|
返回顶楼 | |
发表时间:2007-09-18
irb(main):001:0>self.class => Object
irb(main):002:0>self.is_a?Object =>true 所以。。。 |
|
返回顶楼 | |
发表时间:2007-09-26
疑问:
为什么在a.rb中前面定义的method say会成为Object的一个方法呢? |
|
返回顶楼 | |
发表时间:2007-09-26
看如下代码:
#! /usr/bin/env ruby -w a = 1 b = a.methods.sort b.each do |i| if i =~ /say/ puts "before define say method, say is one of the Object's methods" end end public def say p "hello" end b = a.methods.sort b.each do |i| if i =~ /say/ puts "after define say method, say has become one of the Object's methods" end end 执行结果: after define say method, say has become one of the Object's methods 百思不得其解。请知情人给予提领。 |
|
返回顶楼 | |
发表时间:2007-09-26
是不是可以这样理解呢:
public def say p "hello" end 如上定义之后,say就变成了Kernel Module的一个public method,又由于Object class include 'Kernel‘,这个method就可以被Object以及其子类的instance所使用了。 有例为证: public def say p "hello" end c = Kernel.methods c.each do |i| if i =~ /say/ puts "after define say method, say has become one of the Kernel module's methods" end end 执行结果:after define say method, say has become one of the Kernel module's methods |
|
返回顶楼 | |
发表时间:2007-09-27
在programming ruby 2nd一书中的 part 3中的"top level execution environment'一节中有说明。
|
|
返回顶楼 | |
发表时间:2007-09-27
irb是在object下运行的,在里面定义的任何方面都会成为object的方法
|
|
返回顶楼 | |