注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Ruby基本知识(二)  

2012-01-12 23:00:32|  分类: Ruby |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
类,对象和变量 
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end
initialize是ruby中类的构造方法, 不可以有多个initialize(),也不能overload method

那么我们如何像Java一样实现多个构造方法?

解答:http://www.4ucode.com/Study/Topic/1229154
################################
class ColoredRectangle
def initialize(r, g, b, s1, s2)
@r, @g, @b, @s1, @s2 = r, g, b, s1, s2
end
def ColoredRectangle.white_rect(s1, s2)
new(0xff, 0xff, 0xff, s1, s2)
end
def ColoredRectangle.gray_rect(s1, s2)
new(0x88, 0x88, 0x88, s1, s2)
end
def ColoredRectangle.colored_square(r, g, b, s)
new(r, g, b, s, s)
end
def ColoredRectangle.red_square(s)
new(0xff, 0, 0, s, s)
end
def inspect
"#@r #@g #@b #@s1 #@s2"
end
end
a = ColoredRectangle.new(0x88, 0xaa, 0xff, 20, 30)
b = ColoredRectangle.white_rect(15,25)
c = ColoredRectangle.red_square(40)

如果属性过多,我们可以使用


class PersonalComputer
attr_accessor :manufacturer,
:model, :processor, :clock,
:ram, :disk, :monitor,
:colors, :vres, :hres, :net

def initialize(&block)
instance_eval &block #此处写全应是 self.instance_eval end

# Other methods
end

desktop = PersonalComputer.new do
self.manufacturer = "Acme"
self.model = "THX-1138"
self.processor = "986"
self.clock = 9.6 # GHz
self.ram = 16 # Gb
self.disk = 20 # Tb
self.monitor = 25 # inches
self.colors = 16777216
self.vres = 1280
self.hres = 1600
self.net = "T3"
end

p desktop

怎么样,这样是不是漂亮很多呢?!

注意:block中的self是必须的。

你也可以使用undef方法动态删除你的需要的方法。


desktop = PersonalComputer.new do
self.manufacturer = "Acme"
self.model = "THX-1138"
undef model
end
p desktop.model #报错
#################################################

看到上面的答案,可能你不知道instance_eval是什么?

答案:
#################################################
关于instance_eval and class_eval
http://blog.jiaeil.com/noteit/2010/05/16/digging-ruby-instance_eval-and-class_eval/
instance_eval必须由instance来调用,可以用来定义单态函数singleton_methods
class_eval必须是由class来调用,可以用来定义实例函数instance_methods
#################################################

看到这个答案,你可能就要问,ruby中的self到底指的是什么,是实例还是类?

答案:
####################################################
ruby self在不同语境的含义
http://fuliang.iteye.com/blog/272370
http://rubylearning.com/satishtalim/ruby_self.html

在class和module的定义中,self代表这个class或这module
在实例方法中 这点和java的this代表的东东一样:程序自动传递的调用这个方法的对象
单例方法是针对一个对象添加的方法,只有这个对象拥有和访问这个方法,这时候self是拥有这个方法的对象
在类方法中self代表这个类
####################################################

  评论这张
 
阅读(207)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017