`
bluewave
  • 浏览: 6531 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多
一,  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时一些细致的区别

分享到:
评论
7 楼 sina2009 2007-09-27  
irb是在object下运行的,在里面定义的任何方面都会成为object的方法
6 楼 tony_bai 2007-09-27  
在programming ruby 2nd一书中的 part 3中的"top level execution environment'一节中有说明。
5 楼 tony_bai 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
4 楼 tony_bai 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 


百思不得其解。请知情人给予提领。
3 楼 tony_bai 2007-09-26  
疑问:
为什么在a.rb中前面定义的method say会成为Object的一个方法呢?
2 楼 9esuLuciano 2007-09-18  
irb(main):001:0>self.class => Object
irb(main):002:0>self.is_a?Object =>true
所以。。。
1 楼 bluewave 2007-09-18  
自己跟个贴

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

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

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



相关推荐

    Ruby-irbtools改善Ruby的IRB控制台

    Ruby IRB(Interactive Ruby)是Ruby语言的标准交互式shell,允许开发者在运行时测试代码、探索类库和调试程序。然而,IRB本身的功能相对基础,对于一些高级的开发需求可能显得不够用。这就是irbtools的出现,它为...

    ruby-irb-1.8.7.352-13.el6.x86_64.rpm

    ruby-irb-1.8.7.352-13.el6.x86_64.rpm ruby-irb-1.8.7.352-13.el6.x86_64.rpm

    opal-irb, Opal的IRB ( 交互式 ruby ).zip

    opal-irb, Opal的IRB ( 交互式 ruby ) 蛋白石 irb...ruby 在javascript上运行)的irb ( 交互式 ruby ) 。 这是网页上的交互式控制台( REPL ) 。 不需要安装任何东西就可以交互式测试蛋白石/ruby 。 打算成为基于浏览器的

    irb:交互式Ruby

    内部评级法IRB代表“交互式Ruby”,并且是一种交互式执行从标准输入中读取的Ruby表达式的工具。 Shell中的irb命令将启动解释器。安装将此行添加到您的应用程序的Gemfile中: gem 'irb'然后执行: $ bundle或将其自己...

    Ruby教程 脚本语言

    1. **动态性**:Ruby支持动态类型系统,变量类型在运行时自动确定,允许代码更加灵活。 2. **强类型**:尽管是动态类型,但Ruby仍然是强类型语言,每个值都有其特定的类型,可以防止某些类型错误。 3. **垃圾回收**...

    ruby - ruby tutorial

    进入 IRb 后,可以直接输入 Ruby 代码并按 Enter 键运行。 ### 下一步 完成本教程的学习后,读者应该能够熟练掌握 Ruby 的基本概念和常用操作,并能够开始构建简单的 Ruby 应用程序。接下来,可以继续探索更高级的...

    Ruby/tk学习资料

    文档建议,从交互式模式(irb)运行程序可能不是最佳选择,而是应该直接运行Ruby脚本。下面是一个简单的脚本示例: ```ruby require 'tk' root = TkRoot.new() { title "Hello, world!" } Tk.mainloop() ``` #### 7....

    ABB IRB660工业机器人产品手册.pdf

    ABB IRB660是一款专业的工业堆垛机器人,它的研发与制造体现了ABB公司在工业自动化领域的深厚技术积累。IRB660因其卓越的速度、达到距离和载荷能力,在市场上具有很强的竞争力,尤其是在物料搬运和货盘堆垛领域。...

    100-abb IRB5500与 IRB2400机器人D-H建立坐标系

    ABB IRB5500和IRB2400是两种广泛应用在工业自动化领域的机器人型号。它们被设计用于执行各种任务,如焊接、装配、搬运等。在编程和操作这些机器人时,理解并正确建立D-H(Denavit-Hartenberg)参数坐标系是至关重要...

    ABB IRB2600ID 工业机器人产品手册.pdf

    由于管线内嵌,加上采用可靠的保护措施,IRB2600ID减小了运行时的摆幅,并能有效防止焊接飞溅物和切削液的侵蚀。这不仅延长了机器人的使用寿命,还显著降低了采购和更换成本,据称可达到最多75%的成本节约。同时,...

    Ruby资源ruby-v3.1.1.zip

    为了编写和运行Ruby代码,可以使用内置的`irb`交互式环境,或者使用文本编辑器(如VSCode、Atom等)配合插件进行开发。 Ruby 3.1.1不仅适用于初学者,也是经验丰富的开发者升级现有项目的理想选择。它提供了更好的...

    绿化ruby193

    通过绿化Ruby193,开发者可以在任何支持的系统上快速部署和运行Ruby应用程序,而无需担心与其他已安装的Ruby版本冲突,或者在没有管理员权限的环境中受限。这对于移动开发、云服务和持续集成等场景非常有用。同时,...

    机器人IRB1600.docx

    这是指机器人臂展伸展到最远端时的距离,意味着IRB1600可以在较大的工作区域内进行操作。 ##### 2. 运动性能 - **轴数**:6轴。多轴结构使得机器人具有极高的灵活性,能够实现复杂的空间轨迹控制。 - **重复定位...

    ABB IRB6700 模型

    3. **干涉检查**:确保机器人在工作时不会与其他设备或障碍物发生碰撞。 4. **运动学分析**:研究机器人的关节运动和速度,优化工作周期。 5. **教学编程**:为机器人编写动作指令,预览执行效果。 6. **培训和教育*...

    无涯教程(LearnFk)-Ruby教程完整离线版.pdf

    在编写Ruby代码时,程序员应该遵守特定的语法规则,例如使用井号(#)来表示注释,以及使用特定的保留字和标识符来定义变量和方法等。 总的来说,Ruby作为一种编程语言,它的设计理念、语法、可扩展性和易于维护等...

    Ruby 简介及安装 视频教程

    8. **IRB(交互式Ruby shell)**:学习如何使用IRB进行代码测试和调试,快速验证代码的运行结果。 9. **第一个Ruby程序 "Hello, World!"**:通过编写简单的程序,熟悉Ruby代码的编写和执行流程。 10. **Ruby社区和...

    ABB IRB1600ID 工业机器人产品手册.pdf

    而IRB1600ID由于其集成了所有管线,因此在编程时,程序员可以更容易地避免管线与其他物体的冲突,使得编程过程更简洁、高效。 延长线缆使用寿命也是IRB1600ID的重要特性。管线内嵌于机器人上臂的设计减少了线缆摆动...

Global site tag (gtag.js) - Google Analytics