赋值
一个赋值表达式可以为一个或多个左值(lvalue)指定一个或多个值。
左值 可以出现在一个赋值操作符左侧的东西。
在Ruby中变量、常量、属性及数组元素是左值。
在Ruby中三种不同形式的赋值表达式。
x=1
x,y,z=1,2,3 # set x to 1,y to 2 ,z to 3
x=y=0 #从右到左的顺序依次求值
幂等
赋值操作不是幂等的。
1、对变量进行赋值
Ruby拥有四种类型的变量:局部变量、全局变量、实例变量及类变量
赋值操作的行为是一样的
Ruby的实例变量是永远不可见的。
point.x,point.y=1,2
左值不是变量而是属性。
class Ambiguous
def x;1;end # 方法x,返回值1
def test
puts x
x=0 if false
puts x # x 是一变量,没有被赋值,打印nil
x=2 #赋值
puts x #打印2
end
end
2、对常量赋值
常量变量区别
常量在程序执行期间,值保持不变
针对常量赋值的特殊规则:
1)已存在的常量进行赋值会导致Ruby发出一个警告,然后Ruby仍然会执行这个赋值,意味着常量并不是真正恒久不变的
2)方法体内部是不允许对常量进行赋值的
3、对属性和数组元素的赋值
Ruby中对属性或数组元素的赋值其实是对方法调用的简写。
对象具有名为m=的方法,方法名的最后一个字符是等号,那么o.m可以作为赋值表达式的右值。
更进一步
o.m=v
Ruby解释器将转换成:
o.m=(v)
[]=
o[x]=y # o.[]=(x,y)
o[x,y]=z # o.[]=(x,y,z)
4、缩写形式的赋值
x+=1
+=并不是真正的Ruby操作符,只是缩写
x=x+1
缩写仅在只有一个左值和一个右值的情况下才有效的。
当左值是一个属性时,可以采用缩写形式
o.m+=1
o.m=(o.m()+1)
当左传旧一个数组元素时,可采用缩写
o[x]-=2
o.[] =(x,o.[](x)-2)
常见的缩写:
赋值操作 展开形式
x+=y x=x+y
x-=y x=x-y
x*=y x=x*y
x/=y x=x/y
x%=y x=x%y
x**=y x=x**y
x&&=y x=x&&y
x||=y x=x||y
x&=y x=x&y
x|=y x=x|y
x^=y x=x^y
x<<=y x=x<<y
x>>=y x=x>>y
result ||= []
result= result ||[]
5、并行赋值
多个左值之间采用逗号进行分隔,多个右值之间也是如此。
几种情况:
1)左值和右值的数量相等
x, y, z =1, 2, 3 # x=1;y=2;z=3
x,y=y,x #交换两变量
x=y;y=x # 两值相同
2)一个左值,多个右值
Ruby会创建一个数组来容纳所有右值,并赋给左值
x=1,2,3 # x=[1,2,3]
可以在左值前放一个*,不会改变这个赋值操作的意义,也不会改变返回值。
不希望出现多个右值被放到一个数组,在左值后接一个逗号
x,=1,2,3 # x=1;其他值无效
3)多个左值,一个数组右值
当有多个左值,但是只有一个右值时。
Ruby试图将右值扩展成一个值列表,然后再进行赋值。
x,y,z=[1,2,3] # x,y,z=1,2,3
x=[1,2] #x变在[1,2]
x,=[1,2] #x=1,
4)左值和右值的数量不同
左值多,多的用nil
右值多,多的丢弃
x,y,z=1,2 # x=1;y=2;z=nil
x,y=1,2,3 # x=1;y=2;3丢弃
5)展开操作符
如果一个右值以*开头,就意味着它是一个数组(或一个类似于数组的对象)
x,y,z=1,*[2,3] # same as x,y,z=1,2,3
在Ruby1.8中*只能出现在最后一个右值的前面
在Ruby1.9中一个并行赋值的右值列表里可以出现任意多个*,而且它们可以出现在列表的任何位置。
**都是非法的
x,y=**[[1,2]] #syntaxError!
当一个左值前放*时,意味着所有多外出来的右值都被放入一个数组并赋给该左值。
x,*y=1,2,3 # x=1;y=[2,3]
x,*y=1,2 # x=1;y=[2]
x,*y=1 #x=1;y=[]
在Ruby1.8里,*只能出现在最后一个左值的前面
Ruby1.9里,并行赋值的左侧只能出现一个*,但是它右以出现在左侧任何位置。
*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=1,*[2,3,4] # x=1,y=2,z=[3,4]
6)并行赋值中的圆括号
子赋值
x,(y,z)=a,b
同时进行两个赋值操作
x=a
y,z=b
x,y,z=1,[2,3] # x=1,y=[2,3];z=nil
x,(y,z)=1,[2,3] #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
7)并行赋值的值
并行赋值表达式的返回值是所有右值构成的数组。
如果一个并行赋值紧跟在一个方法名之后,Ruby不会将并行赋值中的逗号解释成左值和右值之间的分隔符,而是解释成该方法的参数分隔符。
puts x,y=1,2
Ruby认为:puts三个参数:x,y=1以及2
puts (x,y=1,2) #还是不行,因为在Ruby中括号可以省略
如果想并行赋值:
puts((x,y-1,2)) #这样才行。
2011-4-10 16:19 danny
一个赋值表达式可以为一个或多个左值(lvalue)指定一个或多个值。
左值 可以出现在一个赋值操作符左侧的东西。
在Ruby中变量、常量、属性及数组元素是左值。
在Ruby中三种不同形式的赋值表达式。
x=1
x,y,z=1,2,3 # set x to 1,y to 2 ,z to 3
x=y=0 #从右到左的顺序依次求值
幂等
赋值操作不是幂等的。
1、对变量进行赋值
Ruby拥有四种类型的变量:局部变量、全局变量、实例变量及类变量
赋值操作的行为是一样的
Ruby的实例变量是永远不可见的。
point.x,point.y=1,2
左值不是变量而是属性。
class Ambiguous
def x;1;end # 方法x,返回值1
def test
puts x
x=0 if false
puts x # x 是一变量,没有被赋值,打印nil
x=2 #赋值
puts x #打印2
end
end
2、对常量赋值
常量变量区别
常量在程序执行期间,值保持不变
针对常量赋值的特殊规则:
1)已存在的常量进行赋值会导致Ruby发出一个警告,然后Ruby仍然会执行这个赋值,意味着常量并不是真正恒久不变的
2)方法体内部是不允许对常量进行赋值的
3、对属性和数组元素的赋值
Ruby中对属性或数组元素的赋值其实是对方法调用的简写。
对象具有名为m=的方法,方法名的最后一个字符是等号,那么o.m可以作为赋值表达式的右值。
更进一步
o.m=v
Ruby解释器将转换成:
o.m=(v)
[]=
o[x]=y # o.[]=(x,y)
o[x,y]=z # o.[]=(x,y,z)
4、缩写形式的赋值
x+=1
+=并不是真正的Ruby操作符,只是缩写
x=x+1
缩写仅在只有一个左值和一个右值的情况下才有效的。
当左值是一个属性时,可以采用缩写形式
o.m+=1
o.m=(o.m()+1)
当左传旧一个数组元素时,可采用缩写
o[x]-=2
o.[] =(x,o.[](x)-2)
常见的缩写:
赋值操作 展开形式
x+=y x=x+y
x-=y x=x-y
x*=y x=x*y
x/=y x=x/y
x%=y x=x%y
x**=y x=x**y
x&&=y x=x&&y
x||=y x=x||y
x&=y x=x&y
x|=y x=x|y
x^=y x=x^y
x<<=y x=x<<y
x>>=y x=x>>y
result ||= []
result= result ||[]
5、并行赋值
多个左值之间采用逗号进行分隔,多个右值之间也是如此。
几种情况:
1)左值和右值的数量相等
x, y, z =1, 2, 3 # x=1;y=2;z=3
x,y=y,x #交换两变量
x=y;y=x # 两值相同
2)一个左值,多个右值
Ruby会创建一个数组来容纳所有右值,并赋给左值
x=1,2,3 # x=[1,2,3]
可以在左值前放一个*,不会改变这个赋值操作的意义,也不会改变返回值。
不希望出现多个右值被放到一个数组,在左值后接一个逗号
x,=1,2,3 # x=1;其他值无效
3)多个左值,一个数组右值
当有多个左值,但是只有一个右值时。
Ruby试图将右值扩展成一个值列表,然后再进行赋值。
x,y,z=[1,2,3] # x,y,z=1,2,3
x=[1,2] #x变在[1,2]
x,=[1,2] #x=1,
4)左值和右值的数量不同
左值多,多的用nil
右值多,多的丢弃
x,y,z=1,2 # x=1;y=2;z=nil
x,y=1,2,3 # x=1;y=2;3丢弃
5)展开操作符
如果一个右值以*开头,就意味着它是一个数组(或一个类似于数组的对象)
x,y,z=1,*[2,3] # same as x,y,z=1,2,3
在Ruby1.8中*只能出现在最后一个右值的前面
在Ruby1.9中一个并行赋值的右值列表里可以出现任意多个*,而且它们可以出现在列表的任何位置。
**都是非法的
x,y=**[[1,2]] #syntaxError!
当一个左值前放*时,意味着所有多外出来的右值都被放入一个数组并赋给该左值。
x,*y=1,2,3 # x=1;y=[2,3]
x,*y=1,2 # x=1;y=[2]
x,*y=1 #x=1;y=[]
在Ruby1.8里,*只能出现在最后一个左值的前面
Ruby1.9里,并行赋值的左侧只能出现一个*,但是它右以出现在左侧任何位置。
*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=1,*[2,3,4] # x=1,y=2,z=[3,4]
6)并行赋值中的圆括号
子赋值
x,(y,z)=a,b
同时进行两个赋值操作
x=a
y,z=b
x,y,z=1,[2,3] # x=1,y=[2,3];z=nil
x,(y,z)=1,[2,3] #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
7)并行赋值的值
并行赋值表达式的返回值是所有右值构成的数组。
如果一个并行赋值紧跟在一个方法名之后,Ruby不会将并行赋值中的逗号解释成左值和右值之间的分隔符,而是解释成该方法的参数分隔符。
puts x,y=1,2
Ruby认为:puts三个参数:x,y=1以及2
puts (x,y=1,2) #还是不行,因为在Ruby中括号可以省略
如果想并行赋值:
puts((x,y-1,2)) #这样才行。
2011-4-10 16:19 danny
发表评论
-
39、代码块的语法
2011-05-30 12:26 696代码块的语法 1.upto(10) {|x| puts x} ... -
38、迭代和并发修改
2011-05-29 18:00 593迭代和并发修改 Ruby的核心集合类都是直接对当前的对象集合 ... -
37、外部迭代器
2011-05-28 11:56 508外部迭代器 iterator=9.downto(1) be ... -
娃娃鸭学Ruby-36、枚举器
2011-05-26 13:38 878枚举器 枚举器是类Enumeralbe::Enumerato ... -
娃娃鸭学Ruby-35、编写自定义的迭代器
2011-05-06 21:28 661自定义的迭代器 可调用一个与方法调用相关联的代码块 def ... -
娃娃鸭学Ruby-34、可枚举的对象
2011-04-26 22:18 782可枚举的对象 Array、Hash、Range及许多其他类都 ... -
娃娃鸭学Ruby-33、迭代器
2011-04-26 09:39 496虽然可用while,until和for循环 但还是更倾向于用迭 ... -
娃娃鸭学Ruby-32、for/in循环
2011-04-25 09:14 998For/in循环 for或for/in循环可对一个枚举对象( ... -
娃娃鸭学Ruby-31、作为修饰符的while和until
2011-04-23 22:49 642作为修饰符的while和until x=0 puts x=x ... -
娃娃鸭学Ruby-30、whie和unitl
2011-04-22 23:56 420While和until while 当某个特定条件为真 unt ... -
娃娃鸭学Ruby-29、?:操作符
2011-04-22 09:08 430?:操作符 def how_many_messages(n) ... -
娃娃鸭学Ruby-28、Case
2011-04-21 22:08 533Case name= case wher ... -
娃娃鸭学Ruby-27、Unless
2011-04-21 11:04 638Unless unless,作为一个语句或修饰符,和if恰好相 ... -
娃娃鸭学Ruby-26、作为修饰符的if
2011-04-20 09:09 652作为修饰符的if 采用if的普通语句形式时,Ruby的语法要 ... -
娃娃鸭学Ruby-25、If
2011-04-19 13:17 504if if 是最简单的条件式,具有多种形式 if expres ... -
娃娃鸭学Ruby-24、操作符
2011-04-17 12:01 640操作符 在Ruby语言中, ... -
娃娃鸭学Ruby-22、方法调用
2011-04-16 13:42 495方法调用 方法调用由四部分组成: 一个任意的表达式,它的 ... -
娃娃鸭学Ruby-21、常量引用
2011-04-15 22:31 617常量引用 除了值在运行期间保持不变外,常量类似于变量。 R ... -
娃娃鸭学Ruby-20、变量引用
2011-04-15 09:01 541变量引用 一个变量就是一个值的名字。 通过赋值表达式可以创建 ... -
娃娃鸭学Ruby-19、字面量和关键字字面量
2011-04-13 08:54 626表达式就是一块Ruby 代码。 在许多语言区分低层的表达式和 ...
相关推荐
《深入理解Ruby调试工具:ruby-debug-ide》 在Ruby编程世界中,高效的问题排查与代码调试是开发者必备的技能之一。ruby-debug-ide正是这样一个强大的调试接口,它为Ruby开发环境提供了集成的调试支持,使得开发者...
src-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2...
Ruby,一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言,在20世纪90年代由日本人松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。...该版本为ruby-1.8.7-p302
标题提到的"ruby-oracle相关的数据库操作的gems包"是指一组用于连接和交互Oracle数据库的Ruby库。描述中指出,这些包主要基于oci8技术,oci8是Oracle公司提供的一个C接口,允许其他编程语言,如Ruby,与Oracle数据库...
在本压缩包“hw-ruby-intro.zip”中,我们主要关注的是RUBY语言在SaaS(Software as a Service)软件工程中的应用。这个压缩包包含了一份名为“hw-ruby-intro”的作业代码,它是针对高级软件工程课程的,特别强调了...
ruby-irb-1.8.7.352-13.el6.x86_64.rpm ruby-irb-1.8.7.352-13.el6.x86_64.rpm
该压缩包文件 "ruby-runtime.hpi" 是 Jenkins 插件的标准格式,扩展名为 ".hpi"(Jenkins Plugin Installable Unit)。HPI 文件可以直接上传到 Jenkins 管理界面的“管理插件”部分进行安装。安装完成后,你可以在 ...
标题中的"ruby-2.5.3-x64"指的是Ruby语言的特定版本,2.5.3,这是一个64位的构建。Ruby的版本迭代频繁,每个新版本通常会包含性能优化、新的特性和错误修复。2.5.3是2018年发布的一个稳定版本,它带来了诸如改进的...
Ruby-GNOME2提供GNOME 2.0开发环境的Ruby绑定,目前在活跃更新中。如果你喜欢GTK的界面,你一定会喜欢Ruby-GNOME2。GTK目前提供Linux、 Windows等多个平台的运行库,也就是说使用GTK开发的应用程序可以在多个平台下...
在这个场景中,"ruby-2.4.3.tar.gz"是一个压缩包,其中包含了Ruby 2.4.3的源代码。这个版本是在2017年发布的,相比CentOS 6.x默认的Ruby版本,它提供了更多的改进和新特性。Ruby 2.4系列引入了性能优化、新的语法糖...
Ruby-JMeter是一个强大的工具,它将Ruby编程语言与Apache JMeter测试框架相结合,为性能测试和负载测试提供了灵活且易于使用的领域特定语言(DSL)。这个工具使得测试人员和开发者能够用Ruby编写JMeter测试计划,...
在本压缩包"ruby-1.9.3-p547.tar.gz"中,包含的是Ruby语言的一个特定版本——1.9.3-p547。 Ruby 1.9.3是Ruby的一个重要版本,发布于2012年,它带来了许多性能提升和新特性。这个版本对Ruby的语法进行了改进,包括更...
- 解压`ruby-2.5.8.tar.gz`:使用`tar -zxvf ruby-2.5.8.tar.gz`命令解压。 - 编译与安装:进入解压后的目录,运行`./configure`,然后`make`和`make install`进行编译和安装。 - 验证安装:通过`ruby -v`检查...
《Ruby调试工具:ruby-debug-1.87详解》 Ruby是一种动态、开源的编程语言,以其简洁的语法和强大的元编程能力深受开发者喜爱。在开发过程中,调试是必不可少的一环,而`ruby-debug-1.87`就是Ruby社区中广泛使用的...
解压`ruby-2.4.5.tar.gz`后,你会得到一个名为`ruby-2.4.5`的目录,其中包含了Ruby源代码的所有文件和子目录。这些文件可能包括但不限于: 1. `README`: 提供关于该版本的基本信息和安装指南。 2. `INSTALL`: 包含...
标题中的"ruby-1.9.2-p290.tar.gz"是一个开源编程语言Ruby的特定版本的归档文件,采用流行的tar和gzip格式进行压缩。这个版本是Ruby的1.9.2分支的一个更新点,标记为p290,意味着它是该分支的第290个补丁级别。在...
mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe
在终端中输入`tar -zxvf ruby-2.6.5.tar.gz`,这会创建一个名为`ruby-2.6.5`的目录,包含所有源代码。 2. **进入目录**:使用`cd`命令进入新解压的目录,如`cd ruby-2.6.5`。 3. **配置**:运行`./configure`脚本...
Ruby-2.2.0是Ruby编程语言的一个版本,它是一个强大的、动态的、面向对象的脚本语言,以其简洁的语法和强调程序员生产力而受到欢迎。Ruby在20世纪90年代由日本的松本行弘(Yukihiro Matsumoto)创建,它的设计哲学是...
在终端中输入`tar -zxvf ruby-1.8.4.tar.gz`,这将创建一个名为`ruby-1.8.4`的目录,包含所有源代码。 3. **编译**:进入解压后的目录,使用`cd ruby-1.8.4`命令。然后运行配置脚本`./configure`,这会检查系统环境...