ruby 存取器 概念
分类:计算机教程

 前面一节的 Fruit 类有两个实变量,分别表述水果的类型和状态.直到为这个类写了一个定制的inspect方法,我们方才了解它不会对一个缺乏属性的水果做出合理的解释.幸运的是,Ruby提供了一种允许实变量总是被初始化的方法.

 什么是一个存取器?

initalize方法

我们在前面已经讨论过实变量了,但却未过多的讨论.一个对象的实变量属于它的属性,也是它与其它来自同一个类的对象的一般区别.读写它的属性是重要的;这样做需要做一个叫着属性存取器(attribute accessors)的方法.我们将很快看到我们并不是总要明确地写出存取器方法,但现在先让我们了解所有的细节.存取器的两种类型是写(writer)和读(reader).

当Ruby创建一个新对象时,它总是会寻找一个名为 initialize 的方法并执行它.因此,我们可以简单通过一个initialize方法向实变量中加入缺省值,这样一来, inspect方法就有东西可说了.

ruby> class Fruit
    |   def set_kind(k)  # a writer
    |     @kind = k
    |   end
    |   def get_kind     # a reader
    |     @kind
    |   end
    | end
   nil
ruby> f1 = Fruit.new
   #<Fruit:0xfd7e7c8c>
ruby> f1.set_kind("peach")  # use the writer
   "peach"
ruby> f1.get_kind           # use the reader
   "peach"
ruby> f1                    # inspect the object
   #<Fruit:0xfd7e7c8c @kind="peach">  

ruby> class Fruit
    |   def initialize
    |     @kind = "apple"
    |     @condition = "ripe"
    |   end
    | end
   nil
ruby> f4 = Fruit.new
   "a ripe apple"  

足够简单;我们可以存取关于我们搜索的水果种类的信息.但我们的方法名还有点儿牢骚.下面的这个更简洁,也更方便.

将缺省的变为需要的

ruby> class Fruit
    |   def kind=(k)
    |     @kind = k
    |   end
    |   def kind
    |     @kind
    |   end
    | end
   nil
ruby> f2 = Fruit.new
   #<Fruit:0xfd7e7c8c>
ruby> f2.kind = "banana"
   "banana"
ruby> f2.kind
   "banana"  

很多时候,缺省值不会有太多的意思.真的是缺省那样的水果吗?也许在创造水果的时候对其类型作要求是个更好的办法.要这样做,我们就必须给initialize 方法加入一个正式的参数.因为一些不会在此提及的原因,你向 new 传递的参数实际上是递给了initialize.

inspect方法

ruby> class Fruit
    |   def initialize( k )
    |     @kind = k
    |     @condition = "ripe"
    |   end
    | end
   nil
ruby> f5 = Fruit.new "mango"
   "a ripe mango"
ruby> f6 = Fruit.new
ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)  

一个小插曲.你已注意到当我们试着直接观察一个对象,就会出现一些像 #<anObject: 0x83678> 的东西.这只是个缺省的行为,我们可以自由地改变它.我们所要做的只是加一个名为 inspect 的方法.它会换一个更明了的描述对象的字符串,包括部分或全部的实变量.

弹性的初始化

ruby> class Fruit
    |   def inspect
    |     "a fruit of the "   @kind   " variety"
    |   end
    | end
   nil
ruby> f2
   "a fruit of the banana variety"  

上面我们看到一旦一个参数被关联到一个 initialize 方法上,就无法在避免错误产生的情况下将其省掉.如果希望考虑周全,我们可以在给了参数的情况下使用它,否则使用缺省值.

一个相关的方法是to_s(转化为字符串),用在打印对象的时候.一般的,你可以认为 inspect 是一个编写或调试程序时用的工具,而 to_s 是一个美化程序输出的方法.eval.rb显示结果时总采用 inspect. 你可以用 p 方法简单的从程序里取得调试信息.

ruby> class Fruit
    |   def initialize( k="apple" )
    |     @kind = k
    |     @condition = "ripe"
    |   end
    | end
   nil
ruby> f5 = Fruit.new "mango"
   "a ripe mango"
ruby> f6 = Fruit.new
   "a ripe apple"  

# These two lines are equivalent:
p anObject
print anObject.inspect, "n"  

可以在任何方法内使用缺省参数,而不仅仅是initialize.参数表(argument list)必须以有缺省值的参数结尾.

生成存取器的简单方法

本文由美洲杯赔率发布于计算机教程,转载请注明出处:ruby 存取器 概念

上一篇:ThinkPHP 中使用 PHPMailer 发送邮件 支持163和QQ邮箱等 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • ruby 存取器 概念
    ruby 存取器 概念
     前面一节的 Fruit 类有两个实变量,分别表述水果的类型和状态.直到为这个类写了一个定制的inspect方法,我们方才了解它不会对一个缺乏属性的水果做出合
  • thinkphp美洲杯赔率: 内置字符串截取函数
    thinkphp美洲杯赔率: 内置字符串截取函数
    在thinkphp模板引擎里可以这样写:{$vo.title|msubstr=0,5,’utf-8′,false} thinkphp内置了一个可以媲美smarty的模板引擎,给我们带来了很大的方便。调用函数也一样,
  • 新瓶旧酒ASP.NET AJAX(1) - 简单地过一下每个控件(
    新瓶旧酒ASP.NET AJAX(1) - 简单地过一下每个控件(
    % @ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Sample.aspx.cs"     Inherits="Overview_Sample" Title="最简单的示例" % asp:Content ID="Content1" 
  • JavaScript 多级联动select
    JavaScript 多级联动select
    请到这里看09-08-18更新版本 能够根据自定义的菜单数据和select,自动设置联级的下拉菜单,可定义默认值。 类似的多级浮动菜单网上也很多实例,但大部分
  • Bootstrap 2.2.2 发布,重要的 Bug 修复版本
    Bootstrap 2.2.2 发布,重要的 Bug 修复版本
    今天我们发布了 Bootstrap 2.2.2, 这是另外一个很大的 bugfix版本,主要是侧重于 CSS 和文档方面的问题修复,也有很小一部分的JS问题,主要包括: Docs: Asset