Ruby编程中的赋值相关操作

在老版本的Ruby中,赋值语句的返回值是设置该属性的方法的返回值。在Ruby1.8中,赋值语句的值总是参数的值而方法的返回值将被丢掉。

class Test
  def val=(val)
    @val = val
    return 99
  end
end

t = Test.new
a = t.val=2
a           ->2

 在老版本中,a将被赋值语句设置为99,而在Ruby1.8中,它的值为2.

Ruby的赋值实际是以并行方式执行的,所以赋值语句右边的值不受赋值语句本身的影响。在左边的任意一个变量或者属性被赋值之前,右边的值按它们出现的顺序被计算出来。下面这个人为设计的例子说明了这一点。第二行讲表达式x ,x+=1和x+=1的值分别赋值给变量a、b和c。

x = 0                 -> 0
a,b,c =x,(x+=1),(x+=1)   ->[0,1,2]

当赋值语句有多于一个左值时,赋值表达式将返回由右值组成的数组。如果赋值语句的左值多于右值,那么多余的左值将被忽略。如果右值多余左值,那么额外的右值将被忽略。如果赋值语句仅有一个左值而有多个右值,那么右值将被转换成数组,然后赋值给左值。

其实,可写属性有个隐藏的陷阱。通常,类中的方法可以通过函数形式(即带一个隐式self作为接收者)调用同一个类的其他方法和它的父类的方法。然而这不适用于属性赋值函数:Ruby看到赋值语句时,会认为左边的名字是局部变量,而不是一个为属性赋值的方法调用。

class BrokenAmplifier
 attr_accessor :left_channel, :right_channel
 def volume=(vol)
   left_channel = self.right_channel = vol
 end
end

ba = BrokenAmplifier.new
ba.left_channel = ba.right_channel =99
ba.volume=5
ba.left_channel          ->99
ba.right_channel         ->5

  在上面的赋值语句中,我们忘了给left_channel加"self."前缀,所以Ruby存储新值给volume= 方法的局部变量,因为根本没有更新对象属性。这会成为难以追踪的缺陷

(0)

相关推荐

  • Ruby编程中的赋值相关操作

    在老版本的Ruby中,赋值语句的返回值是设置该属性的方法的返回值.在Ruby1.8中,赋值语句的值总是参数的值而方法的返回值将被丢掉. class Test def val=(val) @val = val return 99 end end t = Test.new a = t.val=2 a ->2 在老版本中,a将被赋值语句设置为99,而在Ruby1.8中,它的值为2. Ruby的赋值实际是以并行方式执行的,所以赋值语句右边的值不受赋值语句本身的影响.在左边的任意一个变量或者属性被赋值之前

  • CI框架中redis缓存相关操作文件示例代码

    本文实例讲述了CI框架中redis缓存相关操作文件.分享给大家供大家参考,具体如下: redis缓存类文件位置: 'ci\system\libraries\Cache\drivers\Cache_redis.php' <?php /** * CodeIgniter * * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * * Licensed under

  • 整理Linux中字符串的相关操作技巧

    我们在linux的操作中经常会对文件中的字符串进行替换.统计等操作,我们现在来做一次整理,如有错误请批评指正. 统计字符串个数 grep -c str filename grep -o str filename |wc -l 替换字符串 替换当前行匹配字符串 :s/oldStr/newStr 替换当前文件中所有匹配字符串 :%s/原字符串/替换字符串/gg 批量替换字符串 sed -i "s/查找字段/替换字段/g" grep 查找字段 -rl 路径 -rl 表示所有子目录 sed -

  • 对pyqt5中QTabWidget的相关操作详解

    首先,下面贴上designer处理的界面文件(转换成py后的): # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'TabWidget.ui' # # Created by: PyQt5 UI code generator 5.12.1 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtC

  • Python中字典的相关操作介绍

    字典的添加与修改 # coding:utf-8 if __name__ == '__main__': example = {'name': 'xie', 'age': 27} example2 = example.copy() example3 = example.copy() ''' 例1:使用dict[key] = value,这种方法如果dict中存在该key,则修改该key上的值=value,不存在该key,则创建该key=>value 例2:使用dict.setdefault(key,

  • 初步讲解Ruby编程中的多线程

    每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程. Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码. 创建 Ruby 线程 要启动一个新的线程,只需要调用 Thread.new 即可: # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 } # 线程 #1 执行代码 实例 以下实例展示了如何在

  • Ruby编程中的语法使用风格推荐

    使用 :: 引用常量(包括类和模块)和构造器 (比如 Array() 或者 Nokogiri::HTML()).     永远不要使用 :: 来调用方法. # bad SomeClass::some_method some_object::some_method # good SomeClass.some_method some_object.some_method SomeModule::SomeClass::SOME_CONST SomeModule::SomeClass() 使用括号将de

  • 讲解C语言编程中指针赋值的入门实例

    从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它处重新变赋值的.如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值.之后我的程序在其它任何处都不会再去重新对它赋值.那我又应该怎么办呢?用const . /* . . . */ const int ic =20; /* . . . */ ic = 40; /*这样是不可以的,编译时是无

  • Ruby编程中关于中断和返回的用法教程

    return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意. return 常用方式 通常情况下的return语句和大家理解的意思是相同的. def m1 param if param == 1 return 'returned 1' end 'returned default value' # 根据Ruby语言规范,最后一条执行语句的结果将作为返回值返回,return是可选的

  • 设计模式中的观察者模式在Ruby编程中的运用实例解析

    观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种. 在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知. 这通常透过呼叫各观察者所提供的方法来实现. 实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能 体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来, 从根本上违反面向对象的设计的原则.无论是观察者"观察"观察对象, 还是被观察者将自己的改变"通知"观察者,都不应该直接调用.

随机推荐