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

在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页),顶层方法是Objec…
ruby中的私有方法是指方法只能被隐含调用,不能被显示调用.而当没有显示接收者的时候,会把self当成接收者.因此,只能在自身中调用私有方法,这也是私有方法的调用规则. ruby的私有方法机制目的是:使得你很容易将方法分为两种,外部世界可以访问的方法和外部世界不可以访问的方法. 如下: class A def a self.method end def method p "hello world" end private :method end A.new.a method定义成私有方…
在ruby中,当某些特定的事件发生时,将调用回调方法和钩子方法.事件有如下几种: 调用一个不存在的对象方法 类混含一个模块 定义类的子类 给类添加一个实例方法 给对象添加一个单例方法 引用一个不存在的常量 对以上的事件,都可以为之编写一个回调方法,当该事件发生时,这个回调方法被执行.这些回调方法是针对某个对象,或者某个类的,而不是全局的. 下面给出一些例子: 1 Method_missing拦截不能识别的消息 在前面说过,根据对象模型来进行方法查找,如果没有找到,会抛出一个NoMethodErr…
return是函数的返回值 class Mtring def initialize(str) @name = str end def aa ary = @name.split(/:/) return ary.size end end str1 = Mtring.new("Ruby in a shell:hello:2001:USA") p str1.aa #=>4 这段代码涉及了类的实例方法应该怎么给new出来的对象进行赋值. 关于initialize方法,在调用new方法建立对…
#POST请求 请求包是json包 返回body并转换成json对象def post_json *args uri = URI.parse args[0] req = Net::HTTP::Post.new(uri.request_uri) req.body = args[1] res = Net::HTTP.start(uri.hostname, uri.port) do |http| http.request(req) end return JSON.parse(res.body)end #…
最近因为公司需求开始看ruby,先从ruby的基本数据类型开始看 看到ruby的字符串类型string,发现ruby中的字符串单双引号是不一样的,这点和Python有那么点不一样 主要是我们对字符串进行变量引用的时候要使用双引号 如下: 可支持全部的转义字符及用#{exp}将Ruby中的值插入字符串中 例: i = 5 str = “ abab#{i}cjd”  #->abab5cjd “#{‘ho‘ *3} happy new year”  #->ho ho ho happy new yea…
ruby中顶层(top level)中定义的方法放在main中,证明如下: self.private_methods(false) #IN TOP LEVEL 那么methods方法究竟是在哪定义的,书上说是在Object中,但在ruby1.9.2p290中是在Kernel中定义的,证明如下: Kernel.public_instance_methods(false)…
如果ruby中一个局部变量名和私有方法名同名的话,默认该名称被解释为变量而不是方法: x=10; def x;puts "what?" end 当你输入x实际不能执行x方法.解释器只把x解释为变量.而且undef只能对方法而不能对变量下手,所以undef x仍然不行,变量还在那里!一种解决方法是将x方法转换为一个method,然后调用: x_f = method(:x) x_f[] 或者还有一种方法,就是方法别名!你可以指定x的一个别名,这时x肯定会解释为方法: alias new_x…
Ruby中的方法命名遵从与局部变量相同的规则和约定.这是一种设计理念:方法并不因其自身作为方法而被人关注,而是简单地作为提供值的表达式融入到程序的结构中.…
我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb >> exec 'echo "hello $HOSTNAME"' hello codefun $ 注意 exec 利用 echo 命令替换了 irb 进程,然后退出.因为 Ruby 实际上结束了该方法,所以只能有限使用.该方法的缺点是,你无法从 Ruby 脚本中知道命令是执行成功…
Ruby中区分运行来源的方法 这篇文章主要介绍了Ruby中区分运行来源的方法,本文讲解的是类似Python中的if name == 'main':效果,其实Ruby中也有类似语法,需要的朋友可以参考下 当我们在写模块的时候,或多或少需要直接运行这个文件也可以执行一些方法,但是这样对于当这个模块被require或者include时,显得不好,在ruby里,有没有区分运行来自当前文件,还是被require的目标文件调用呢? Python可以 比如像Python这样 if __name__ == '_…
上一篇讲了ruby中的可调用对象proc和lambda,他们都是块转换成的对象.ruby中的可调用对象还有方法.通过使用method方法,并且以方法名作为参数(字符串或者符号),就可以得到一个方法对象. 如下: class C def talk p "hello world" end end c = C.new meth = c.method :talk meth.call 输出: "hello world" 类C有个实例方法talk.类C的实例c调用方法metho…
ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicObject类).这期间经历过的路径就是祖先链. 1混含模块和继承的方法查找 对于一个实例对象,先找它属于的类中是否有对应的实例方法,然后看这个类中是否有模块,如果有,查找模块中是否有对应的方法,如果没有,则查找父类.先看父类的实例方法,再看父类中是否有模块,再看父类的父类..一直到最后,BasicO…
先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScript写的,但是也放在了ruby语言里面,这个没有关系.题目内容是有一个类Calc,通过链式方法调用,可以实现加减乘除.如图给的四个例子.数字只有0-9,运算只有加减乘除,而且每个运算只有一个操作符.(可以先不看下面,自己先想一下怎么写) 首先,每一个例子都是同样的结构---类名和四个方法.拿第一个…
Ruby中使用patch HTTP方法 如果使用patch,在后台可以看到只更新了改动的部分: Started PATCH "/ads/5/update" for ::1 at 2017-04-20 20:12:40 +0800 Processing by AdsController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>&qu…
作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够,但在你看看完我的这篇文章后,相信你不会再担心会遇到这些头疼的问题. 什么是作用域? 当谈论到作用域的时候,应该马上想到变量和可见性这两个词,变量和可见性是作用域的主要内容,没错,作用域就是关于在代码的什么地方什么变量是可见的,当你充分了解了作用域后,给你一段代码,你可以轻易知道此时什么变量是可见的,…
作用域(scope)指的是变量的可达性或可见性.不同类型的变量有不同的作用域规则.与self类似,作用域在程序的执行过程中也在不断的变化,也可以根据上下文推断出"谁在什么作用域中".但是,self和作用域不是同一个东西,在self没有变化的时候,可以开始一个新的局部作用域,有时候,作用域和self一起改变. 全局作用域和全局变量:全局变量最不常用,但需要了解.全局变量用$开始,在整个程序的任何位置都可以访问,穿过所有的边界. 局部作用域:在任意时刻,程序都处在一个特定的局部作用域中.两…
self,自己,在ruby中表示当前对象或默认对象.程序执行的任一时刻,有且仅有一个self. 1.谁成为self,在什么位置成为self? 要知道哪个对象是self,就必须知道当前的上下文.上下文主要有顶层上下文,类定义上下文,模块定义上下文,方法定义上下文.可以根据下图总结的内容进行self的判断. 上下文 例子 哪个对象是self 顶层 在任何定义块之外的代码 main(内建的默认顶层对象) 类定义 class C 类对象C 模块定义 module M 模块对象M 方法定义 1 顶层方法…
Ruby中的类变量,很多文章都是不太建议使用的,主要原因在于他的一些特性容易导致犯一些错误,尤其在广泛使用元编程的时候. 初步接触类变量可能觉得他跟C++的类静态成员和Java中的静态变量没什么区别,但在实际使用中一不留神就会掉到类变量的陷阱中去 陷阱1,类变量跟类实例变量不同,类实例变量关联的是self,但类变量关联的是当前类作用域 class C end class D end class C @@var = "C" def D.getvar @@var end end class…
原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引起误解的特性. 这有可能是因为Ruby使用相当独特的方式来处理闭包.Ruby有四种处理闭包的方式,每一种方式都稍有点不同,甚至有点荒诞,这使得事情变得有点复杂.有不少网站提供了一些关于Ruby闭包的工作方式,但是我还没有找到一个非常有效的指南,希望本篇文章会成为这样的一篇指南. 一.首先来说bloc…
#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#%Q #用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") puts %Q(1.Joe said: "Frank said: "#{what_frank_said}"") #“#”不能省 =…
Block Blocks就是存放一些可以被执行的代码的块,通常用do...end 或者 {}表示 例如: [1, 2, 3].each do |num| puts num end [1, 2, 3].each { |num| puts num } Blocks可以和.each..times等联合使用,用来对每一个元素执行一段指令. 还有很多非常有用的方法需要用到Blocks,例如 collect collect方法可把数组中的每个元素都传给Blocks, 在Blocks中可对数组元素进行操作 例…
javascript 中的 splice 方法很强大,它可以用于插入.删除或替换数组的元素. 下面来一一介绍! 删除:用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数) 插入:向数组指定位置插入任意项元素.三个参数,第一个参数(其实位置),第二个参数(0),第三个参数(插入的项) 替换:向数组指定位置插入任意项元素,同时删除任意数量的项,三个参数.第一个参数(起始位置),第二个参数(删除的项数),第三个参数(插入任意数量的项) var lang = ["php&…
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symbol 对象的方法是在名字或者字符串前面加上冒号: 创建 symbol 对象 :foo :test :”abc” :”I am a boy” 你可能会问,字符串就是字符串,干吗还有字符串的名字?这是因为在 Ruby 中字符串也是一种对象,即 String 对象.无论其结构还是操作和 Symbol 对象…
看看如何调试Ruby的性能问题 李哲 - APRIL 08, 2015 Ruby内置的profiler 内置的profiler实现的很简单,在ruby2.2中只有150行代码,大家可以看看它的实现profile.rb .内置的profiler使用起来非常的方便,只需要加上-rprofile参数即可.例如: 执行: ruby -rprofile test.rb 输出结果为: % cumulative self self total time seconds seconds calls ms/cal…
一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是每个事件都对应同一个事件处理器,在该事件处理器中对不同的事件进行分类处理,这样的弊端有两点:第一,导致该事件处理器过于臃肿复杂:第二,这样不便于扩展,当系统新增加事件类型或者是我们需要使用到自定义事件时,就不得不修改Qt的源码来达到目的.所以Qt设计者的做法是针对不同类型的事件提供不同的事件处理器与…
Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method [ruby] view plaincopyprint? s = "cat" def s.upcase "CaT" end s_dup = s.dup s_clone = s.clone s_dup.upcase #=> "CAT" (single…
1.类名的定义以大写字母开头,单词首字母大写,不用"_"分隔 2.实例化对象的时候调用new方法,实际上调用的是类里边的initialize方法,是ruby类的初始化方法,功能等同于Java中的构造方法 class Person def initialize(name, gender, age) @name = name @gender = gender @age = age end end 3.可以使用attr_accessor关键字标记实例变量,为其提供读写方法,类似java中的g…
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务必一致 建议4: 避免带有变长参数的方法重载 建议5: 别让null值和空值威胁到变长方法 建议6:覆写变长方法也循规蹈矩 建议7:警惕自增的陷阱 建议8:不要让旧语法困扰你 建议9:少用静态导入 建议10:不要在本类中覆盖静态导入的变量和方法 建议11:养成良好习惯,显示声明UID 建议12:避免…
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在ruby中对于字符串类型我们可以用乘法生成一个指定数量重复的字符串: irb(main):002:0> money = "9" => "9" irb(main):003:0> money * 99 => "99999999999999999999999999999999999999999…