`
piecehealth
  • 浏览: 46575 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ruby new方法的理解。

阅读更多
之所以喜欢ruby,是因为理解ruby后,用ruby解释所有东西都那么自然。比如别的语言创建对象都是Xxx instance = new Xxx(),不要问为什么,就是要这么写。当然Ruby创建对象是instance = Xxx.new,但是这里,我们可以用ruby的commonsense来解释。

Xxx.new可以看成Xxx执行了一个类方法:new,运行以下代码便知。
class Test

	def self.new *args, &blk
		puts *args.join(',')
	end

	def initialize a, b, c
		puts "Kan Bu Jian Wo!!"
	end

end

Test.new(1, 2, 3) # 1,2,3



由上可知,ruby创建实例实际是调用了类的方法new,所以我们重写了new方法所以就创建不出实例了。

最后献上根据以上解释写出的单例模式:
module Singleton
	
	def self.included(klass)
		klass.class_eval do
			(class << self; self; end).class_eval do
				alias_method :original_new, :new
				def new *args, &blk
					@instance ||= original_new(*args, &blk)
				end
			end
		end
	end
	
end

class Test
	include Singleton
end

tst1 = Test.new
tst2 = Test.new

puts tst1.object_id
puts tst2.object_id


include Singleton模块的所有类通过new产生的实例都是同一个实例。
分享到:
评论

相关推荐

    prototype.js 1.4 原代码阅读

    * 返回的构造函数会执行名为 initialize 的方法, initialize 是 Ruby 对象的构造器方法名字。 * 此时initialize方法还没有定义,其后的代码中创建新类型时会建立相应的同名方法。 * * 如果一定要从java上去理解...

    oanda_api:Oanda REST API的ruby客户端

    包装器将本机Ruby对象与API可以理解的JSON表示形式相互转换。 例如, client = OandaAPI :: Client :: TokenClient . new ( :practice , "practice_account_token" ) account = client . account ( 12345 ) . get...

    MarkovQuote:Ruby Markov 随机文本生成类 - 基于名言

    马尔可夫报价马尔可夫随机报价文本生成器主要只是演示如何在 Ruby 中使用。用法 mq=MarkovQuote.new()puts mq.generate示例生成的报价美国是翻译中迷失的东西。 人类处于无可指责的维斯塔的地盘! 这个世界不劳而获...

    enki:面向时尚开发人员的Ruby on Rails博客应用程序。 比Mephisto或SimpleLog更好

    恩基 面向时尚开发人员的Ruby on Rails博客应用程序。 偏好是针对大众的。 任何真正的程序员都知道定制东西的最简单,最好的方式是破解代码。 因为您希望自己成为博客,所以不要以每页20条而不是15条标准安装#4958...

    gkv:Git作为Ruby中的KV商店

    类型被隐式理解,并被自动设置/加载。 仅排除符号。 有4个主要功能: 放 db [键] =值 db = Gkv :: Database . new db [ 'Pants' ] = 'red leather' # =&gt; 'red leather' 这允许使用运算符重载来设置速记符号,而...

    掌握Ajax.rar

    理解 Ajax 及其工作原理,构建网站的一种有效方法 Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本系列的作者是一位 Ajax 专家,他...

    snail:Ruby宝石,可帮助收集和格式化国际地址

    new ( :name =&gt; "Jon Doe" , :line_1 =&gt; "12345 Somewhere Ln" , :line_2 =&gt; nil , :city =&gt; "Bentley" , :region =&gt; "WA" , :postal_code =&gt; "6102" , :country =&gt; "AU" ) . to_s =&gt; "Jon Doe \n 1

    matlab导入excel代码-Experiment:实验是用于运行科学实验(例如AI,GA...)的Ruby库和环境,特别适合用于通过算法或

    ...)的Ruby库和环境,特别适合通过算法或参数的变化来优化结果的实验​​。 安装 $ sudo gem install experiment 还要确保您正在运行最新版本的gem update experiment 。 入门 实验是在rails之后进行建模的,工作流...

    monadist:几个流行的 monad 的实际实现

    方法命名遵循 Haskell 约定,因此 gem 可用于尝试理解 monad(主要在使用 Haskell 的教程中描述)。 单子实现: 身份(用于教育目的) 也许 列表 延续 同时 安装 将此行添加到应用程序的 Gemfile 中: gem '...

    ASP API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    JSP API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    PHP API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    .NET API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    JS JSP ASP .NET J2AM API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    JS API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    2AM API接口和返回的版本

    顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子中你还会看到如何使用加密传输。 view plaincopy to ...

    computationbook:理解计算的示例代码

    )需要Ruby 1.9或2.0。 现在,这是本书中相当粗略的代码转储。 每章都有自己的目录: 第2章:第三章:第4章:第5章:第六章:什么都不做FizzBu​​zz与procs λ演算第7章:普遍性无处不在部分递归函数SKI组合器演算...

    paloma:Rails的页面特定JavaScript正确完成

    重要 master分支包含前沿开发代码。 检查branches或tags以获取最新的稳定版本或特定版本。 帕洛玛 Rails的页面特定javascript正确完成。 优点 选择每页要运行的特定JavaScript代码。... 轻松在您的javascript文件... new

    git-utils:Git实用程序脚本

    重点是git open , git pull-request , git push-branch和git undo ,如果没有它们,您将永远无法理解。 git-utils以前是纯Bash脚本,但现在可以作为Ruby gem使用: gem install git-utils有关git-utils定义的命令...

    schema-dot-org:经过验证的网站结构化数据

    Google搜索会努力理解页面的内容。 您可以通过提供有关页面含义的明确线索来帮助我们。 。 。用法假设您有一个Rails应用。 如果将其放在控制器中: @public_law = Organization . new ( name : 'Public.Law' , ...

Global site tag (gtag.js) - Google Analytics