ruby编程语言-学习笔记2(第4章 表达式和操作符)
对属性和数组元素的赋值
o.m + = 1 ===》o.m = (o.m()+ 1) # 对 o.m()这个方法的结果+1
对数组元素的赋值也是通过 方法调用来完成。
0.[] = 1 ===>o.[] = o.[] +1 #对o实例对象的[]方法,的结果+1
如果一个对象o定义了一个接受2个参数的、名为[]=的方法
o.[x] = y ===》 那么 o.[] = (x, y)
如果一个对象具有一个接受三个参数的、名为[]=的方法,那么方括号中的值,会被当作索引
o.[x,y] = z ===>那么 o.[] = (x, y, z)
------------分割线---------------------
缩写形式的赋值
#这个和c、c++ 类似,就不多说了
x+ = 1 ===》 x = x + 1
o.m + =1 ===> o.m = (o.m() +1)
o[x] -= 2 ===> o.[] = (x, o.[](x) - 2) # o.[]方法的第一个参数为x,第二个参数为o.[](x) - 2
---------
有个比较特殊 result ||= []
分一下几种情况:
1.若result 为false或nil,则result会被赋值为一个新的空数组
2.若result 不为false或nil,则没有任何操作发生, result最终还是=result
note:result = result || [] ,这个展开式,无论result值如何,都会发生赋值操作。
--------分割线----------
并行赋值
1)左值和右值 数量相等
x, y, z = 1, 2, 3 # x= 1; y=2; z =3
x,y = y,x #swap the value of two variable
x=y; y=x #both varibales have both value, 解释下,就是说有2个变量x和y,值相同。
2)一个左值,多个右值
当只有一个左值,但是有多个右值的时候,ruby会创建一个数组来容纳右值,并将这个数组赋给左值
x= 1,2,3 ===》 x = [1,2,3]
可以在左值前加一个*,这不会改变这个赋值操作的意义,也不会改变返回值。
x = 1,2,3 ===> *x = [1,2,3]
但是,如果你不想右值组合成一个数组,只想取第一个值可以这样 x, = 1,2,3 ===> x = 1
3)多个左值,一个数组右值
x, y, z = [1, 2, 3] #same as ===> x, y, z = 1, 2, 3
x = [1, 2] # x become [1, 2], this is not parallel assignment
x, = [1, 2] # x become 1
4)左值和右值 数量不同时
x, y, z = 1, 2 # x = 1, y = 2, z = nil
x, y = 1, 2, 3 # x = 1, y = 2, 3 is not assigned anywhere
4.5.5.5
展开操作符
如果右值以*开头,则意味着它是一个数组(或类似数组的对象)它的每个元素都是右值。
x, y, z = 1, *[2,3] # x, y ,z = 1, 2, 3
x, y, z, m, n = 1, *[2,3], 4, *[5] # x, y ,z, m, n= 1, 2, 3, 4, 5
*只能一个,当出现** 编译器报错,Syntax Error
note:
ruby 1.8 中,数组,范围,hash右值可以展开,
ruby 1.9 中,数组,范围,枚举右值可以展开,
可以自己定义一个可展开的类型, ruby 1.8 定义to_ary()方法实现, ruby 1.9中to_ary改名为to_splat
-----分割线-------
当左值放*时,多的右值会放入一个数组中,并赋给该左值。
x, *y = 1, 2, 3 ===> x = 1, y = [2, 3]
x, *y = 1, 2 ===> x = 1, y = [2]
x, *y = 1 ===> x = 1, y = nil
ruby 1.8 左值*只能出现一个,且在左值最后一个上,
ruby 1.9 左值* 也只能出现一个,但是可以出现在左值的任何位置。
#ruby 1.9 only
*x, y = 1, 2, 3 ===> x = [1,2], y = 3
*x, y = 1, 2 ===> x = [1], y = 2
*x, y = 1 ===> x = [], y = 1
并行赋值中的圆括号
x, (y, z) = a, b ===>相等与 x= a 和 y, z = b
x, y, z = 1, [2, 3] #no parens, x = 1; y = [2, 3]; z = nil
x, (y, z) = 1, [2, 3] #parens, x= 1; y = 2; z= 3
a, b, c, d = [1, [2, [3, 4]]] #no parens, a = 1; b = [2, [3, 4]] ; c = d = nil
a, (b , (c, d)) = [1, [2, [3, 4]]] #parens, a= 1; b = 2; c = 3; d = 4
刚开始学ruby, 写下这些,只是为了加深自己的印象。
若出现错误,或者我有理解错误的地方,
请指正。衷心感谢。
ruby编程语言-学习笔记2(第4章 表达式和操作符)的更多相关文章
- ruby编程语言-学习笔记5(第5章 语句和控制结构)
以下是2种表达方式一样. if expression code end if expression then #推荐这种形式 code end expression的值不是false或nil,则cod ...
- ruby编程语言-学习笔记4(第4章 表达式和操作符)
4.6.9 范围 Flip-Flops: ..和... ..和... 操作符不是基于方法的,无法重定义.(优先级比较低) x+1 .. x*x #可以认为是x+1 至 x*x 的范围 因为操作 ...
- ruby编程语言-学习笔记3(第4章 表达式和操作符)
4.6 操作符 了解优先级很重要 位移操作符 (0b1011)<< 1 # ==> "10110" 11 << 1 = 22 ...
- ruby编程语言-学习笔记1
安装完 ruby ri irb ruby-devel 1. 先来个简单的,写个helloworld 给新手们 (terminal中,# 代表root权限,$ 代表用户权限, 前面的就不写了.) # ...
- C++ premier 中文版 学习笔记(第五章 表达式)
解应用和自增组合使用的理解 由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于*(iter++).子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达 ...
- 【c++ Prime 学习笔记】第4章 表达式
表达式由一个或多个运算对象组成,对表达式求值返回结果. 字面值和变量是最简单的表达式 把运算符和运算对象组合可得到复杂表达式. 4.1 基础 4.1.1 基本概念 一元运算符作用于一个对象,如取地址符 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回
- 《深入Java虚拟机学习笔记》- 第16章 控制流
<深入Java虚拟机学习笔记>- 第16章 控制流
随机推荐
- TreeMap 红黑树实现
TreeMap 是一个有序的key-value集合,它是通过 红黑树 实现的. TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合. TreeMap 实现了 ...
- 在Mac OS X中使用VIM开发STM32(2)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在我先前的博文⎣在Mac OS X中使用VIM开发STM32(1)⎤中,我们安装完成了MACVIM,这一 ...
- CentOS 7 install LNMP
CentOS 7 install LNMP 关于 Nginx (发音 “engine x”)这是一款免费.开源.高效的 HTTP 服务器,Nginx是以稳定著称,丰富的功能,结构简单,低资源消耗.本教 ...
- scroll
var fScrollTopHeight = function(){ return document.documentElement&&document.documentElement ...
- AVFoundation 初识
AVFoundation是苹果 OS X系统和 iOS系统中用于处理基于时间的媒体数据的高级Objective-C框架. iOS中 AVFoundation 在整个体系中所处的角色
- thinkphp表单上传文件并将文件路径保存到数据库中
上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` ( `id` int(11) ...
- C# WinForm动态控件实例:口算训练
昨天晚上回寝室看到室友正在被一个C#课的作业苦恼,作业的内容是编写一个口算训练程序,能够实现随意添加题目数量.于是,喜欢写C#的我就决定解救一下他们. 创建动态控件 既然要动态添加,那就必须使用动态控 ...
- Python从list删除元素
Paul同学刚来几天又要转走了,那么我们怎么把Paul 从现有的list中删除呢? 如果Paul同学排在最后一个,我们可以用list的pop()方法删除: >>> L = ['Ada ...
- <六> jQuery 获得内容和属性
获得内容 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - ...
- 移动前端javascript事件
移动端事件: // 手势事件 touchstart //当手指接触屏幕时触发 touchmove //当已经接触屏幕的手指开始移动后触发 touchend //当手指离开屏幕时触发 touchcanc ...