对属性和数组元素的赋值

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章 表达式和操作符)的更多相关文章

  1. ruby编程语言-学习笔记5(第5章 语句和控制结构)

    以下是2种表达方式一样. if expression code end if expression then #推荐这种形式 code end expression的值不是false或nil,则cod ...

  2. ruby编程语言-学习笔记4(第4章 表达式和操作符)

    4.6.9 范围  Flip-Flops:  ..和... ..和... 操作符不是基于方法的,无法重定义.(优先级比较低) x+1 .. x*x   #可以认为是x+1 至 x*x 的范围 因为操作 ...

  3. ruby编程语言-学习笔记3(第4章 表达式和操作符)

    4.6 操作符 了解优先级很重要 位移操作符 (0b1011)<< 1       #   ==> "10110"      11 << 1 = 22 ...

  4. ruby编程语言-学习笔记1

    安装完 ruby ri irb ruby-devel 1. 先来个简单的,写个helloworld  给新手们 (terminal中,# 代表root权限,$ 代表用户权限, 前面的就不写了.) # ...

  5. C++ premier 中文版 学习笔记(第五章 表达式)

    解应用和自增组合使用的理解 由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于*(iter++).子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达 ...

  6. 【c++ Prime 学习笔记】第4章 表达式

    表达式由一个或多个运算对象组成,对表达式求值返回结果. 字面值和变量是最简单的表达式 把运算符和运算对象组合可得到复杂表达式. 4.1 基础 4.1.1 基本概念 一元运算符作用于一个对象,如取地址符 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  8. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  9. 《深入Java虚拟机学习笔记》- 第16章 控制流

    <深入Java虚拟机学习笔记>- 第16章 控制流

随机推荐

  1. Linux中的简单命令

    history:打印你输过的命令      1.用户在shell中输入的命令会自动保存到内存缓冲区      2.在退出shell的时候,内存中的数据会刷新到磁盘文件:~/.bash_history ...

  2. setInterval()与setTimeout()计时器

    JavaScript是单线程语言,但是它可以通过设置超时值和间歇时间值来指定代码在特定的时刻执行.超时值是指在指定时间之后执行代码,间歇时间值是指每隔指定的时间就执行一次代码. 超时调用 超时调用使用 ...

  3. DataNavigator之分页

    前言 做客户端也有两个月了,先前做列表都没有分页,可能考虑数据也不是很多,昨天做了一个页面,考虑到了数据的问题,所以改为分页查询.因为也是第一次用dev,用哪个控件分页呢,还是要去搜一下,得出的事Da ...

  4. appcan 跨窗口处理方法 appcan.window.evaluateScript({name,scriptContent,type})使用解读

    appcan.window.evaluateScript({ name,/*主窗口名称,此窗口要先用appcan.window.open打开了,才能找到,此方法才会有效*/ scriptContent ...

  5. css3的3D翻牌效果

    利用hover控制动画,一个从翻面向正面翻,一个从正面向反面翻. 利用:backface-visibility: hidden;控制反面的元素不显示. 不支持的浏览器直接切换层级换图. <!DO ...

  6. PHP学习心得(三)——处理表单

    表单的任何元素都在 PHP 脚本中自动生效. 一个简单的 HTML 表单: <form action="action.php" method="post" ...

  7. 压力测试之apache benchmark

    ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求.前段时间看到 ...

  8. jquery 里面的$(document).ready 和 DOMContentLoaded

    DOMContentLoaded 事件是当页面的初始dom tree加载好了就会执行. 而不会去等待外部的css 渲染完成和 js执行完成,即下图中的DOM Tree阶段 DOMContentLoad ...

  9. #LeetCode# Container With Most Water (todo)

    描述: 实现1 -- 求所有可能的值,O(N^2),超时了(因为超时没有跑所有的测试用例,所以不确定还有没有其他问题) 代码: def maxArea(self, height): tmp = len ...

  10. ubuntu中文版切换为英文后字体变化问题解决

    为了熟悉更多Linux 的英语词汇,希望把Ubuntu 的界面换成英文的.使用System->Administration->Language Suport( 系统-> 管理-> ...