对象
Objects
Ruby是纯粹的面向对象的语言:所有的值都是对象,而且没有基本类型和对象类型的区别。
所有对象都继承一个Object类,共享此类中的方法
1、对象引用
在Ruby中使用对象时,其实是在使用对象的引用。
s="Ruby"
t=s #只是引用,t和s指向同一个值
t[-1]="" # 修改t 同时修改s
print s # "Rub"
t="Java" #这时t指向另一对象
print s,t # Prints "RubJava"
在Ruby中,当把一个对象传递给一个方法时,其实传递的是该对象的引用,被传递的是对象本身,也不是一个指向该对象的引用的引用。换言之,方法实参是通过值而不是引用来传递,只不过被传递的值正好是对象的引用。
会修改引用的底层对象。
立即值
2、对象生命周期
Ruby内建类都具有字面量方法,只须直接将这些值写入代码。
new方法
myObject =myClass.new
new是Class类的一个方法
1)为新对象分配内存
2)调用对象的initialize方法初始化这个新建的”空“对象的状态
3)传递给new方法的参数。
initialize方法用来完成必须的初始化
工厂方法
Ruby永远不需要显式释放对象
垃圾收集(garbage collection)
3、对象标识
每个对象都有一个对象标识符,它是一个Fixnum,可通过object_id 方法来获得
该方法的返回值在该对象的生命周期是独一无二且恒久不变的,只要该对象是可访问的,就一直持有同一ID,其他对象也不会共享
id方法是object_id的同义词
__id__是object_id的同义词
4、对象的类和对象的类型
o="test"
o.class # Returns String class
o.class.superclass # Object
o.class.superclass.superclass # nil
Ruby1.9中Object不再是类继承结构的真正根元素了:
#Ruby1.9 only
Object.superclass # BasicObject
BasicObject.superclass #nil
检查对象
o.class==String # true
instance_of? 同样
o.instance_of? String # true
is_a?
kind_of? 同义词
x=1
x.instance_of? Fixnum # true
x.instance_of? Numeric # false
x.is_a? Fixnum # true
x.is_a? Integer # true
x.is_a? Numeric # true
x.is_a? Comparable # true
x.is_a? Object #true
==
Numeric==x # true
<<
数组,字符串,文本及其他IO定义为追加操作(append operator)
o.respond_to? :"<<" # true if o has an << operator
5、对象的相等性
1) equal?方法
equal?方法由Object定义,测试两个值是否引用了同一个对象
a="Ruby"
b=c="Ruby"
a.equal?(b) # false
b.equal?(c) # true
按照惯例,子类永远不要重写equal?方法
另一个检查两个对象
object_ida.object_id==b.object_id #works like a.equal?(b)
2)==操作符
相等性比较
在Object中它是equal?方法的同义词
大多数类都重定义这个操作符
a="Ruby"
b="Ruby"
a.equal?(b) #false
a==b #true
注意:
同Java正好是相反的。
!=
3)eql?方法
Object将eql?方法定义成equal?方法的同义词
重定义了eql?方法的类通常将其作为一个严格版的==操作符,不允许进行类型转换
1==1.0 # true
1.eql?(1.0) #false
4)===操作符
条件相等性操作符
case when
(1..10)===5 #true
/\d+/==="123" # true
String==="s" #true
:s==="s" #true in Ruby 1.9
5)=~操作符
模式匹配
2011-4-7 21:16 danny
6、对象的顺序
<=>
1<=>5 # -1
5<=>5 # 0
9<=>5 #1
"1"<=>5 # nil
<
<=
==
>=
>
1.between?(0,10) # true 0<=1<=10
nan
nan=0.0/0.0 #
nan<0 # false
nan>0 #false
nan==0 #false
nan==nan #false
nan.equal?(nan) #true
7、对象的转换
1)显式转换
to_s String
to_i Integer
to_f Float
to_a Array
注意:
不会自动进行to_s转换,但内插到双引号的字符串自动to_s转换
2)隐式转换
Ruby1.8
Exception 类似字符串的对象
e=Exception.new("not really an exception")
msg="Error:"+e # String concatenation with an Exception
3)转换函数
Kernel模块定义了四个转换函数:
Array
Float
Integer
String
4)算术操作符的类型强制转换
coerce转换方法
类型转换成调用者的类型或更一般的兼容类型
5)布尔类型转换
true
false to_s 返回 "true" "false"
在布尔表达式里,任何不同于false或nil的值都表现像true一样
nil 则表现得像false,但是不能转换成true或false
if x!=nil
puts x
end
if x
puts x
end
以上两相同
同C或javascript区别:0,0.0 空字符串""的值表现得像true。
8、拷贝对象
Object
clone
dup
返回对象的浅拷贝
clone和dup区别:
clone会拷贝一个对象的被冻结(frozen)和受污染(tainted)状态
dup仅仅拷贝受污染状态,在一个被冻结的对象上调用dup方法将返回一个未被冻结副本
clone方法会拷贝对象的所有单键方法,dup不会
9、编组对象
Marshal.dump
Marshal.load
Marshal.dump和Marshal.load方法的用法是创建对象的深拷贝
def deepcopy(o)
Marshal.load(Marshal.dump(o))
end
10、冻结对象
freeze方法将任何对象冻结起来,一个被冻结的对象将变得不可改变
所有的内部状态都不能被改变,而对其可变方法的调用也会失败
s="ice"
s.freeze
s.frozen? # true
s.upcase! #typeError
s[0]=nil #typeError
11、污染对象
避免SQL注入攻击及类似的安全风险
解决方法:
可以通过调用其taint方法将任何对象标记成受污染的(tainted)。一旦一个对象成了受污染的,那么任何源自它的对象都将成为受污染的。 tainted?测试
s="untrusted"
s.taint
s.tainted? #true
s.upcase.tainted? #true
s[3,4].tainted? #true
2011-4-8 14:10 danny
Objects
Ruby是纯粹的面向对象的语言:所有的值都是对象,而且没有基本类型和对象类型的区别。
所有对象都继承一个Object类,共享此类中的方法
1、对象引用
在Ruby中使用对象时,其实是在使用对象的引用。
s="Ruby"
t=s #只是引用,t和s指向同一个值
t[-1]="" # 修改t 同时修改s
print s # "Rub"
t="Java" #这时t指向另一对象
print s,t # Prints "RubJava"
在Ruby中,当把一个对象传递给一个方法时,其实传递的是该对象的引用,被传递的是对象本身,也不是一个指向该对象的引用的引用。换言之,方法实参是通过值而不是引用来传递,只不过被传递的值正好是对象的引用。
会修改引用的底层对象。
立即值
2、对象生命周期
Ruby内建类都具有字面量方法,只须直接将这些值写入代码。
new方法
myObject =myClass.new
new是Class类的一个方法
1)为新对象分配内存
2)调用对象的initialize方法初始化这个新建的”空“对象的状态
3)传递给new方法的参数。
initialize方法用来完成必须的初始化
工厂方法
Ruby永远不需要显式释放对象
垃圾收集(garbage collection)
3、对象标识
每个对象都有一个对象标识符,它是一个Fixnum,可通过object_id 方法来获得
该方法的返回值在该对象的生命周期是独一无二且恒久不变的,只要该对象是可访问的,就一直持有同一ID,其他对象也不会共享
id方法是object_id的同义词
__id__是object_id的同义词
4、对象的类和对象的类型
o="test"
o.class # Returns String class
o.class.superclass # Object
o.class.superclass.superclass # nil
Ruby1.9中Object不再是类继承结构的真正根元素了:
#Ruby1.9 only
Object.superclass # BasicObject
BasicObject.superclass #nil
检查对象
o.class==String # true
instance_of? 同样
o.instance_of? String # true
is_a?
kind_of? 同义词
x=1
x.instance_of? Fixnum # true
x.instance_of? Numeric # false
x.is_a? Fixnum # true
x.is_a? Integer # true
x.is_a? Numeric # true
x.is_a? Comparable # true
x.is_a? Object #true
==
Numeric==x # true
<<
数组,字符串,文本及其他IO定义为追加操作(append operator)
o.respond_to? :"<<" # true if o has an << operator
5、对象的相等性
1) equal?方法
equal?方法由Object定义,测试两个值是否引用了同一个对象
a="Ruby"
b=c="Ruby"
a.equal?(b) # false
b.equal?(c) # true
按照惯例,子类永远不要重写equal?方法
另一个检查两个对象
object_ida.object_id==b.object_id #works like a.equal?(b)
2)==操作符
相等性比较
在Object中它是equal?方法的同义词
大多数类都重定义这个操作符
a="Ruby"
b="Ruby"
a.equal?(b) #false
a==b #true
注意:
同Java正好是相反的。
!=
3)eql?方法
Object将eql?方法定义成equal?方法的同义词
重定义了eql?方法的类通常将其作为一个严格版的==操作符,不允许进行类型转换
1==1.0 # true
1.eql?(1.0) #false
4)===操作符
条件相等性操作符
case when
(1..10)===5 #true
/\d+/==="123" # true
String==="s" #true
:s==="s" #true in Ruby 1.9
5)=~操作符
模式匹配
2011-4-7 21:16 danny
6、对象的顺序
<=>
1<=>5 # -1
5<=>5 # 0
9<=>5 #1
"1"<=>5 # nil
<
<=
==
>=
>
1.between?(0,10) # true 0<=1<=10
nan
nan=0.0/0.0 #
nan<0 # false
nan>0 #false
nan==0 #false
nan==nan #false
nan.equal?(nan) #true
7、对象的转换
1)显式转换
to_s String
to_i Integer
to_f Float
to_a Array
注意:
不会自动进行to_s转换,但内插到双引号的字符串自动to_s转换
2)隐式转换
Ruby1.8
Exception 类似字符串的对象
e=Exception.new("not really an exception")
msg="Error:"+e # String concatenation with an Exception
3)转换函数
Kernel模块定义了四个转换函数:
Array
Float
Integer
String
4)算术操作符的类型强制转换
coerce转换方法
类型转换成调用者的类型或更一般的兼容类型
5)布尔类型转换
true
false to_s 返回 "true" "false"
在布尔表达式里,任何不同于false或nil的值都表现像true一样
nil 则表现得像false,但是不能转换成true或false
if x!=nil
puts x
end
if x
puts x
end
以上两相同
同C或javascript区别:0,0.0 空字符串""的值表现得像true。
8、拷贝对象
Object
clone
dup
返回对象的浅拷贝
clone和dup区别:
clone会拷贝一个对象的被冻结(frozen)和受污染(tainted)状态
dup仅仅拷贝受污染状态,在一个被冻结的对象上调用dup方法将返回一个未被冻结副本
clone方法会拷贝对象的所有单键方法,dup不会
9、编组对象
Marshal.dump
Marshal.load
Marshal.dump和Marshal.load方法的用法是创建对象的深拷贝
def deepcopy(o)
Marshal.load(Marshal.dump(o))
end
10、冻结对象
freeze方法将任何对象冻结起来,一个被冻结的对象将变得不可改变
所有的内部状态都不能被改变,而对其可变方法的调用也会失败
s="ice"
s.freeze
s.frozen? # true
s.upcase! #typeError
s[0]=nil #typeError
11、污染对象
避免SQL注入攻击及类似的安全风险
解决方法:
可以通过调用其taint方法将任何对象标记成受污染的(tainted)。一旦一个对象成了受污染的,那么任何源自它的对象都将成为受污染的。 tainted?测试
s="untrusted"
s.taint
s.tainted? #true
s.upcase.tainted? #true
s[3,4].tainted? #true
2011-4-8 14:10 danny
发表评论
-
39、代码块的语法
2011-05-30 12:26 698代码块的语法 1.upto(10) {|x| puts x} ... -
38、迭代和并发修改
2011-05-29 18:00 597迭代和并发修改 Ruby的核心集合类都是直接对当前的对象集合 ... -
37、外部迭代器
2011-05-28 11:56 509外部迭代器 iterator=9.downto(1) be ... -
娃娃鸭学Ruby-36、枚举器
2011-05-26 13:38 879枚举器 枚举器是类Enumeralbe::Enumerato ... -
娃娃鸭学Ruby-35、编写自定义的迭代器
2011-05-06 21:28 663自定义的迭代器 可调用一个与方法调用相关联的代码块 def ... -
娃娃鸭学Ruby-34、可枚举的对象
2011-04-26 22:18 783可枚举的对象 Array、Hash、Range及许多其他类都 ... -
娃娃鸭学Ruby-33、迭代器
2011-04-26 09:39 497虽然可用while,until和for循环 但还是更倾向于用迭 ... -
娃娃鸭学Ruby-32、for/in循环
2011-04-25 09:14 1000For/in循环 for或for/in循环可对一个枚举对象( ... -
娃娃鸭学Ruby-31、作为修饰符的while和until
2011-04-23 22:49 644作为修饰符的while和until x=0 puts x=x ... -
娃娃鸭学Ruby-30、whie和unitl
2011-04-22 23:56 422While和until while 当某个特定条件为真 unt ... -
娃娃鸭学Ruby-29、?:操作符
2011-04-22 09:08 431?:操作符 def how_many_messages(n) ... -
娃娃鸭学Ruby-28、Case
2011-04-21 22:08 535Case name= case wher ... -
娃娃鸭学Ruby-27、Unless
2011-04-21 11:04 638Unless unless,作为一个语句或修饰符,和if恰好相 ... -
娃娃鸭学Ruby-26、作为修饰符的if
2011-04-20 09:09 654作为修饰符的if 采用if的普通语句形式时,Ruby的语法要 ... -
娃娃鸭学Ruby-25、If
2011-04-19 13:17 506if if 是最简单的条件式,具有多种形式 if expres ... -
娃娃鸭学Ruby-24、操作符
2011-04-17 12:01 642操作符 在Ruby语言中, ... -
娃娃鸭学Ruby-23、赋值
2011-04-16 22:02 653赋值 一个赋值表达式可以为一个或多个左值(lvalue)指定一 ... -
娃娃鸭学Ruby-22、方法调用
2011-04-16 13:42 497方法调用 方法调用由四部分组成: 一个任意的表达式,它的 ... -
娃娃鸭学Ruby-21、常量引用
2011-04-15 22:31 619常量引用 除了值在运行期间保持不变外,常量类似于变量。 R ... -
娃娃鸭学Ruby-20、变量引用
2011-04-15 09:01 543变量引用 一个变量就是一个值的名字。 通过赋值表达式可以创建 ...
相关推荐
《深入理解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
在本压缩包“hw-ruby-intro.zip”中,我们主要关注的是RUBY语言在SaaS(Software as a Service)软件工程中的应用。这个压缩包包含了一份名为“hw-ruby-intro”的作业代码,它是针对高级软件工程课程的,特别强调了...
标题提到的"ruby-oracle相关的数据库操作的gems包"是指一组用于连接和交互Oracle数据库的Ruby库。描述中指出,这些包主要基于oci8技术,oci8是Oracle公司提供的一个C接口,允许其他编程语言,如Ruby,与Oracle数据库...
ruby-irb-1.8.7.352-13.el6.x86_64.rpm ruby-irb-1.8.7.352-13.el6.x86_64.rpm
标题中的"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-1.9.3-p547.tar.gz"中,包含的是Ruby语言的一个特定版本——1.9.3-p547。 Ruby 1.9.3是Ruby的一个重要版本,发布于2012年,它带来了许多性能提升和新特性。这个版本对Ruby的语法进行了改进,包括更...
解压`ruby-2.4.5.tar.gz`后,你会得到一个名为`ruby-2.4.5`的目录,其中包含了Ruby源代码的所有文件和子目录。这些文件可能包括但不限于: 1. `README`: 提供关于该版本的基本信息和安装指南。 2. `INSTALL`: 包含...
- 解压`ruby-2.5.8.tar.gz`:使用`tar -zxvf ruby-2.5.8.tar.gz`命令解压。 - 编译与安装:进入解压后的目录,运行`./configure`,然后`make`和`make install`进行编译和安装。 - 验证安装:通过`ruby -v`检查...
标题中的"ruby-1.9.2-p290.tar.gz"是一个开源编程语言Ruby的特定版本的归档文件,采用流行的tar和gzip格式进行压缩。这个版本是Ruby的1.9.2分支的一个更新点,标记为p290,意味着它是该分支的第290个补丁级别。在...
《Ruby调试工具:ruby-debug-1.87详解》 Ruby是一种动态、开源的编程语言,以其简洁的语法和强大的元编程能力深受开发者喜爱。在开发过程中,调试是必不可少的一环,而`ruby-debug-1.87`就是Ruby社区中广泛使用的...
Ruby-Http2库通过`Stream`对象抽象了这一概念,提供了管理流状态和交换数据的方法。 4. **错误处理**:HTTP/2协议定义了一系列错误代码,Ruby-Http2库会根据这些代码抛出相应的异常,帮助开发者识别和处理网络问题...
在终端中输入`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)创建,它的设计哲学是...
mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe
在终端中输入`tar -zxvf ruby-1.8.4.tar.gz`,这将创建一个名为`ruby-1.8.4`的目录,包含所有源代码。 3. **编译**:进入解压后的目录,使用`cd ruby-1.8.4`命令。然后运行配置脚本`./configure`,这会检查系统环境...
2. `sqlite3-ruby-1.3.1-x86-mswin32-60.gem`: 这个gem包同样为1.3.1版本,专为64位Windows系统(mswin32-60可能指的是Ruby 1.9.3的编译环境)设计,同样是针对x86架构的。 3. `sqlite3-ruby-1.3.1.gem`: 这是一个...