论坛首页 编程语言技术论坛

请教irb与正式运行ruby时的不同之处?

浏览 4370 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-18  
一,  a.rb文件代码如下:
---------------
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时一些细致的区别

   发表时间:2007-09-18  
自己跟个贴

修改a.rb文件代码如下:
---------------
public
def say
p "hello"
end
a = 1
a.say
---------------
运行之,正常显示 hello

由此推测irb运行时默认添加了一句public

呵呵,看来要看看irb相关文档了



0 请登录后投票
   发表时间:2007-09-18  
irb(main):001:0>self.class => Object
irb(main):002:0>self.is_a?Object =>true
所以。。。
0 请登录后投票
   发表时间:2007-09-26  
疑问:
为什么在a.rb中前面定义的method say会成为Object的一个方法呢?
0 请登录后投票
   发表时间: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 


百思不得其解。请知情人给予提领。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2007-09-27  
在programming ruby 2nd一书中的 part 3中的"top level execution environment'一节中有说明。
0 请登录后投票
   发表时间:2007-09-27  
irb是在object下运行的,在里面定义的任何方面都会成为object的方法
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics