对象
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 669代码块的语法 1.upto(10) {|x| puts x} ... -
38、迭代和并发修改
2011-05-29 18:00 552迭代和并发修改 Ruby的核心集合类都是直接对当前的对象集合 ... -
37、外部迭代器
2011-05-28 11:56 477外部迭代器 iterator=9.downto(1) be ... -
娃娃鸭学Ruby-36、枚举器
2011-05-26 13:38 827枚举器 枚举器是类Enumeralbe::Enumerato ... -
娃娃鸭学Ruby-35、编写自定义的迭代器
2011-05-06 21:28 632自定义的迭代器 可调用一个与方法调用相关联的代码块 def ... -
娃娃鸭学Ruby-34、可枚举的对象
2011-04-26 22:18 759可枚举的对象 Array、Hash、Range及许多其他类都 ... -
娃娃鸭学Ruby-33、迭代器
2011-04-26 09:39 475虽然可用while,until和for循环 但还是更倾向于用迭 ... -
娃娃鸭学Ruby-32、for/in循环
2011-04-25 09:14 972For/in循环 for或for/in循环可对一个枚举对象( ... -
娃娃鸭学Ruby-31、作为修饰符的while和until
2011-04-23 22:49 618作为修饰符的while和until x=0 puts x=x ... -
娃娃鸭学Ruby-30、whie和unitl
2011-04-22 23:56 369While和until while 当某个特定条件为真 unt ... -
娃娃鸭学Ruby-29、?:操作符
2011-04-22 09:08 388?:操作符 def how_many_messages(n) ... -
娃娃鸭学Ruby-28、Case
2011-04-21 22:08 500Case name= case wher ... -
娃娃鸭学Ruby-27、Unless
2011-04-21 11:04 610Unless unless,作为一个语句或修饰符,和if恰好相 ... -
娃娃鸭学Ruby-26、作为修饰符的if
2011-04-20 09:09 630作为修饰符的if 采用if的普通语句形式时,Ruby的语法要 ... -
娃娃鸭学Ruby-25、If
2011-04-19 13:17 470if if 是最简单的条件式,具有多种形式 if expres ... -
娃娃鸭学Ruby-24、操作符
2011-04-17 12:01 609操作符 在Ruby语言中, ... -
娃娃鸭学Ruby-23、赋值
2011-04-16 22:02 624赋值 一个赋值表达式可以为一个或多个左值(lvalue)指定一 ... -
娃娃鸭学Ruby-22、方法调用
2011-04-16 13:42 466方法调用 方法调用由四部分组成: 一个任意的表达式,它的 ... -
娃娃鸭学Ruby-21、常量引用
2011-04-15 22:31 590常量引用 除了值在运行期间保持不变外,常量类似于变量。 R ... -
娃娃鸭学Ruby-20、变量引用
2011-04-15 09:01 524变量引用 一个变量就是一个值的名字。 通过赋值表达式可以创建 ...
相关推荐
Ruby,一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言,在20世纪90年代由日本人松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。...该版本为ruby-1.8.7-p302
ruby-1.9.2-p290.tar.gz,ruby,redmin,安装,
ruby-irb-1.8.7.352-13.el6.x86_64.rpm ruby-irb-1.8.7.352-13.el6.x86_64.rpm
ruby-debug-ide-0.3.1.gem
Ruby-GNOME2提供GNOME 2.0开发环境的Ruby绑定,目前在活跃更新中。如果你喜欢GTK的界面,你一定会喜欢Ruby-GNOME2。GTK目前提供Linux、 Windows等多个平台的运行库,也就是说使用GTK开发的应用程序可以在多个平台下...
mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe
ruby-2.6.5.tar.gz 来自官网, ruby-2.6.5.tar.gz 来自官网, ruby-2.6.5.tar.gz 来自官网,
ruby-debug-base19-0.11.26.gem
瑞传 RUBY-9719VG2AR主板pdf,瑞传 RUBY-9719VG2AR主板
MySQL分析 innodb
ruby-2.4.1.tar.gz
ruby-build 是一个 rbenv 插件,它提供了一个 rbenv install 命令来在类 UNIX 系统上编译和安装不同版本的 Ruby。你还可以在需要精确控制 Ruby 版本安装的环境中使用不带 rbenv 的 ruby-build。用法在开始之前,...
ruby-oci8-2.1.5-x86-mingw32.gem,ruby连接oracle数据库gem包
sqlite3-ruby-mswin32.gem
ROXML - Ruby对象与XML映射的库
ruby-1.8.5.tar for Liunx 开魔力宝贝单机必须软件之一
官网原版安装包,官网的下载真的很慢...
ruby-1.9.3-p547.tar.gz
ruby-2.4.5 由于官方下载速度慢,所以在这里提供下载。
ruby-git, ruby/Git是一个 ruby 库,可以通过将系统调用包装到Git二进制文件来创建读取和操作Git存储库 用于 ruby的 Git库在 ruby 中使用Git的库。主页项目源代码的Git public 位于:...