Programming Ruby学习笔记二

第三章     类、对象和变量

    Ruby中initialize相当于Java里面的构造函数。当调用new创建一个新的对象时,Ruby首先分配一些内存来保存未初始化的对象,然后调用对象的initialize方法,并把调用new时所使用的参数传入该方法。

    Inspect方法(可以发送给任何对象)默认将对象的ID和实例变量格式化。

    Ruby有一个标准消息to_s,可以发送给任何一个想要输出字符串表示的对象。

    要注意的一点是,Ruby中的类永远都不不是封闭的,可以向一个已有的类中添加方法。这适用于自己编写的类,也使用于标准的内建(bulit-in)类。只要打开某个已有类的类定义,就可以将指定的新内容添加进去。

 

3.1 继承和消息

    类定义中使用”<”可以指定父类,如”KaraokeSong < Song”中,KaraokeSong是Song的子类(subclass)。

    当调用super而不使用参数时,Ruby想当前对象的父类发送一个消息,要求它调用子类中的同名方法。Ruby将我们原先调用方法时的参数传递给父类的方法。

    如果在定义一个类时没有指定父类,将默认以Object类作为其父类。这意味着所有类的始祖都是Object,并且Object的实例方法对Ruby所有对象都可用。

 

3.2 对象和属性

    通常会定义一些方法来访问及操作对象的状态,让外部世界得以与之交互。一个对象的外部可见部分被称为属性(attribute)。

    Ruby提供了attr_reader创建相关实例变量的访问方法。如 “attr_reader :name,:artist,:duration”,将创建name,artist,duration的访问方法。

    可以通过创建一个名字以等号结尾的方法来达成对实例变量赋值。这些方法可以作为赋值操作的目标。实际上,定义一个以等号结尾的方法名,便使其能够出现在赋值操作的左侧。

    Ruby提供了attr_writer创建相关实例变量的设置方法。

    根据统一访问原则(Uniform Access Principle),可以设置虚拟属性来隐藏实例变量与计算的值的差异,以此来实现对外部世界屏蔽类。

 

3.3 类变量和类方法

    对一个给定的类来说,类变量只存在一份拷贝。类变量有两个@@开头。类变量在使用之前必须被初始化。通常,初始化就是在类定义中的简单赋值。

    类方法和实例方法是通过它们的定义区别的:通过在方法名之前放置类名以及一个句点,来定义类方法。

    可以使用类方法作为伪构造函数(pseudo-constructors)。

 

3.4 访问控制

    一个经验法则:永远不要暴露会导致对象处于无效状态的方法。

    Public(公有)方法可以被任何人调用,没有限制访问控制,方法默认就是public的(initialize除外,它是private的)。

    Protected(保护)方法只能被定义了该方法的类或其子类的对象所调用。整个家族均可访问。

    Private(私有)方法不能被明确的接收者调用,其接收者只能是self。这意味着私有方法只能在当前对象的上下文中被调用,不能调用另一个对象的私有方法。

    有两种方式使用public、protected、private这3个函数来指定访问级别。如果使用时没有参数,这3个函数设置后续定义方法的默认访问控制。另外可以通过将方法名作为参数列表传入访问控制函数来设置访问级别。注意:设置方法的访问级别时,需确认已定义了该方法。

 

3.5 变量

    变量只是对象的引用。对象漂浮在某处一个很大的池中(大多数是堆),并由变量指向它们。可以理解为变量存放的是对象的指针。

    赋值别名(alias)对象,潜在地给了引用同一对象的多个变量。

    可以通过冻结一个对象来阻止其他人对其进行改动。

转载于:https://www.cnblogs.com/PandaBamboo/archive/2012/08/23/2652839.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Programming Ruby版(Second Edition)英文版于2005年出版,之后有了中文版。但可惜的是网上流传的中文版PDF基本上都是扫描版的,文字内容得自己打出来,看到好的代码也得自己动手,无法Ctrl-C + Ctrl-V,还不如看英文版的非扫描版。于是我就想到发布英文非扫描版的Programming Ruby Second Edition(与Ruby1.8结合),希望各位同学有所收获…… 以下摘录部分内容: From Page 305 Strings Ruby provides a number of mechanisms for creating literal strings. Each generates objects of type String. The different mechanisms vary in terms of how a string is delimited and how much substitution is done on the literal’s content. Single-quoted string literals ('stuff ' and %q/stuff /) undergo the least substitution. Both convert the sequence \\ into a single backslash, and the form with single quotes converts \' into a single quote. All other backslashes appear literally in the string. 'hello' ! hello 'a backslash \'\\\'' ! a backslash '\' %q/simple string/ ! simple string %q(nesting (really) works) ! nesting (really) works %q no_blanks_here ; ! no_blanks_here Double-quoted strings ("stuff ", %Q/stuff /, and %/stuff /) undergo additional substitutions, shown in Table 22.2 on the next page. a = 123 "\123mile" ! Smile "Say \"Hello\"" ! Say "Hello" %Q!"I said 'nuts'," I said! ! "I said 'nuts'," I said %Q{Try #{a + 1}, not #{a 1}} ! Try 124, not 122 % ! Try 124, not 122 "Try #{a + 1}, not #{a 1}" ! Try 124, not 122 %{ #{ a = 1; b = 2; a + b } } ! 3 Strings can continue acrossmultiple input lines, in which case they will contain newline characters. It is also possible to use here documents to express long string literals. Whenever Ruby parses the sequence <<identifier or <<quoted string, it replaces it with Prepared exclusively

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值