在ruby中写顶层函数的时候,总会有一个问题,self是谁,这些方法是谁的,是什么方法。

如下:

 p self

 p self.class

 def talk
p self
end talk

  输出main,Object,main

  由此可见,在写顶层代码的时候,ruby自动提供了一个默认的self,它是Object类的实例对象,main。

  那么这个方法talk是属于谁呢?虽然它当前的self是main。

  通过特殊的规定(就是规定的。参考ruby for rails中文版153页),顶层方法是Object类的私有实例方法。

  私有实例,意味着,不能显示调用。而每个对象所属的类都是Object的后代,因此每个对象都可以调用顶层方法,只是不能显示调用。

如下:

 def talk
puts "hello world"
end
talk obj = Object.new def obj.method
talk
end
obj.method obj.talk

  输出是hello world, hello world,in `<main>': private method `talk' called for #<Object:0x1ee7768> (NoMethodError)

  定义一个顶层方法talk,main作为接收者调用,合法。定义一个Object的对象obj,为obj建立一个单例方法method,在method中调用talk,也合法。这是因为在单例方法中self是obj,而obj是Object的一个实例,可以调用Object的实例方法(顶层方法是私有实例方法)。但是在外面直接调用talk方法则不行,因为talk是一个私有方法。如错误所说。

  另外,puts ,print那些顶层方法,是kernel内建的私有实例方法。因此也不能显示调用。

ruby中的顶层方法的更多相关文章

  1. ruby中的私有方法和保护方法

    ruby中的私有方法是指方法只能被隐含调用,不能被显示调用.而当没有显示接收者的时候,会把self当成接收者.因此,只能在自身中调用私有方法,这也是私有方法的调用规则. ruby的私有方法机制目的是: ...

  2. ruby中的回调方法和钩子方法

    在ruby中,当某些特定的事件发生时,将调用回调方法和钩子方法.事件有如下几种: 调用一个不存在的对象方法 类混含一个模块 定义类的子类 给类添加一个实例方法 给对象添加一个单例方法 引用一个不存在的 ...

  3. ruby中的return方法及class实例方法的initialize方法

    return是函数的返回值 class Mtring def initialize(str) @name = str end def aa ary = @name.split(/:/) return ...

  4. ruby中http请求方法整理

    #POST请求 请求包是json包 返回body并转换成json对象def post_json *args uri = URI.parse args[0] req = Net::HTTP::Post. ...

  5. Ruby字符串的一些方法

    最近因为公司需求开始看ruby,先从ruby的基本数据类型开始看 看到ruby的字符串类型string,发现ruby中的字符串单双引号是不一样的,这点和Python有那么点不一样 主要是我们对字符串进 ...

  6. ruby中顶层定义的方法究竟放在哪里?

    ruby中顶层(top level)中定义的方法放在main中,证明如下: self.private_methods(false) #IN TOP LEVEL 那么methods方法究竟是在哪定义的, ...

  7. ruby中如何调用与局部变量同名的私有方法

    如果ruby中一个局部变量名和私有方法名同名的话,默认该名称被解释为变量而不是方法: x=10; def x;puts "what?" end 当你输入x实际不能执行x方法.解释器 ...

  8. Ruby中方法的设计理念

    Ruby中的方法命名遵从与局部变量相同的规则和约定.这是一种设计理念:方法并不因其自身作为方法而被人关注,而是简单地作为提供值的表达式融入到程序的结构中.

  9. 在 Ruby 中执行 Shell 命令的 6 种方法

    我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...

随机推荐

  1. PHPMailer发送邮箱(ThinkPHP实战篇)

    1.下载phpmailer文件库 2.引用文件,此处将代码放到 :函数库中,function.php function sendConsultantMessage($sendData){ Vendor ...

  2. sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)

    Clockwise Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya have a long necklace with ...

  3. 【代码备份】NLM插值

    文件路径: main.m: %% 测试函数 clc,clear all,close all; %输入的原始小图 ima_ori=double(imread('F:\Users\****n\Docume ...

  4. matlab判断图像是彩色图还是灰度图

    matlab怎样看图像是彩色还是灰度_莹莹_新浪博客 http://blog.sina.com.cn/s/blog_76088a1f0101diq0.html 解决一: isrgb(A) 如果A是RG ...

  5. C++中的自动存储、静态存储和动态存储

    根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆).在存在是间的长短方面,以这三种方式分配的数据对象各不相同.下面简要介绍这三种类型( ...

  6. selenium的常用方法

    1.常用定位方法 find_element_by_id()find_element_by_name()find_element_by_class_name()find_element_by_tag_n ...

  7. Java中break、continue、return语句的使用区别

    break.continue.return之间的区别与联系 在软件开发过程中,逻辑清晰是非常之重要的. 代码的规范也是非常重要的.往往细节决定成败.在编写代码的时候,一定要理解语言的作用以及使用的方法 ...

  8. java发展历程、常用dos命令与jDK工具使用

    Java菜鸟学习之旅 1.勤敲代码 2.必须将课堂上讲的内容学到位 2.1 学到会用 2.2 在学会之前不要自作主张 2.3 当天课程当天完成 3.能说会道 3.1 善于表达 3.2 学会的都能讲 4 ...

  9. jquery 最全知识点图示

    有个别错字,请原谅:谢谢 1.选择器 2.DOM操作 3.DOM 4.事件 5.Ajax

  10. Ubuntu下编译C语言程序(同时给编译生成的文件命名)

    1.创建c文件 test.c touch test.c 2.编写test.c vim test.c #include "stdio.h" int main(){ printf(&q ...