扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
12、在case语句
case obj
when obj_1
....
when obj_k
....
中,调用的是“===”方法而不是“==”方法。另外,运算的顺序是“obj_k === obj”而不是“obj === obj_k”。
以这样的顺序进行运算可以使Ruby更灵活的匹配obj。有意思的是当obj_k分别为Module/Class、Regexp和Range时:
·Module/Class类定义了“===”方法,用于测试obj是否是此模块/类的实例或者其派生类的实例(“obj#kind_of?obj_k”)。
·Regexp类定义了“===”方法,用于判断obj是否匹配此模式(“obj =~ obj_k”)。
·Range类定义了“===”方法,用于判断obj是否是此范围中的一个元素(“obj_k.include?obj”)。
13、在调用方法时,不要在括号“(”前加空格。另外,如果你将$VERBOSE设为true,那么Ruby将因此产生一个警告。
14、用于函数调用的“点”运算符是最强的运算符。因此,在Ruby中表示浮点数的小数点后必须是数字,而在其它许多语言中并没有这个要求。例如,“1.e6”将会调用对象1(一个Fixnum对象)的方法“e6”。你必须使用“1.0e6”。
不过注意,尽管“点”运算符是最强的运算符,但是与方法名连用时,不同版本的Ruby表现是不一样的。至少在Ruby1.6.7中,“puts (1..3).length”将会产生一个语法错误,此时应该使用“puts((1..3).length)”。
15、“0..k”代表一个Range对象,而“[0..k]”代表一个数组,这个数组只有一个Range类型的元素。
举个例子,如果
[0..2].each do |i|
puts "i = #{i}"
end
没有给出你想要的结果,那么你也许应该试试
(0..2).each do |i|
puts "i = #{i}"
end
或者
0.upto(2) do |i|
puts "i = #{i}"
end
注意Ruby没有元组(不可变的数组)类型的对象,而括号也经常放在Range对象周围以确保优先级正确(例如上例中“点”运算符强于“点点”运算符)。
16、在Ruby中,只有false和nil在布尔运算中被认为是false。特别是0(零),“”和‘’(空字符串),[](空数组),{}(空哈希表)都被认为是true。
17、Ruby中的变量只保存对象的引用,因此使用=运算符时仅复制引用本身。另外,诸如a += b的自赋值也被转换为a = a + b的形式。因此你最好知道某个操作究竟是创建了一个新的对象还是改变了一个已经存在的对象。
例如,string << "another"比string += "another"快(没有创建额外的对象),所以你理所当然应该使用某个类已经定义的更新函数(如果你真的想这么做)。不过,小心“边界效应”,它会影响所有其它引用同一个对象的变量:
a = 'aString'
c = a
a += ' modified using +='
puts c # -> "aString"
a = 'aString'
c = a
a << ' modified using <<'
puts c # -> "aString modified using <<"
18、在Ruby中没有标准的内建深度拷贝方法。要获得相同的效果可以使用序列化/排列(serialization/marshalling)技术。因为在Ruby中所有的东西都是引用,所以“拷贝”对象(比如通过dup或clone方法)时要小心,尤其是拷贝那些包含其它对象的对象(比如数组和哈希表)且包含的深度又超过一层时。
19、一般情况下,一个类变量是属于整个继承链而不仅仅是类本身的(比如,一个类变量由父类及其所有派生类所“共享”的)。令人迷惑的是,如果一个子类在其父类之前创建了类变量,那么情况就不同了。例如,如果一个父类首先创建了一个类变量:
class Base
def initialize
@@var = 'base'
end
def base_set_var
@@var = 'base'
end
def base_print_var
puts @@var
end
end
class Derived < Base
def initialize
super
@@var = 'derived'
end # notice
def derived_set_var
@@var = 'derived'
end
def derived_print_var
puts @@var
end
end
d = Derived.new
d.base_set_var
d.derived_print_var # -> 'base'
d.base_print_var # -> 'base'
d.derived_set_var
d.derived_print_var # -> 'derived'
d.base_print_var # -> 'derived'
在上面这段代码中,类变量@@var实际上是被基类和派生类所“共享”的。现在再来看看如果一个子类先创建类变量会发生什么:
class Base
def initialize
@@var = 'base'
end
def base_set_var
@@var = 'base'
end
def base_print_var
puts @@var
end
end
class Derived < Base
def initialize
@@var = 'derived'
super
end # changed
def derived_set_var
@@var = 'derived'
end
def derived_print_var
puts @@var
end
end
d = Derived.new
d.base_set_var
d.derived_print_var # -> 'derived'
d.base_print_var # -> 'base'
d.derived_set_var
d.derived_print_var # -> 'derived'
d.base_print_var # -> 'base'
在这种情况下,父类和子类就具有了两个相互独立但又具有相同名字的类变量。
20、反斜线的替换是比较奇特的。例如:
str = 'a\b\c' # -> a\b\c
puts str.gsub(/\\/,'\\\\') # -> a\b\c
puts str.gsub(/\\/,'\\\\\\') # -> a\\b\\c
puts str.gsub(/\\/,'\\\\\\\\') # -> a\\b\\c
puts str.gsub(/\\/) { '\\\\' } # -> a\\b\\c
puts str.gsub(/\\/, '\&\&') # ->a\\b\\c
·你最好知道
a.在Ruby中,“自赋值运算符”不止是“+=,-=,*=,/=,%=”这几个。尤其是像“||=”这样的运算符也是可用的(目前这些运算符还不能作用于未定义的类变量,不过在将来版本的Ruby中可能会有所改变)。完整的列表请参考《Programming Ruby》一书中的表18.4。
b.在“PLEAC-Ruby”(ttp://pleac.sourceforge.net/pleac_ruby/t1.html)上有一个包含很多算法和例程的手册。
c.在“Numerical Ruby”(ttp://www.ir.isas.ac.jp/~masa/ruby/index-e.html)上有更多关于数字计算的信息。
d.在“Numerical Ruby”(ttp://www.ir.isas.ac.jp/~masa/ruby/na/SPEC.en)上还有一个“NArray”,它比Ruby本身的(数字)数组占用更少的内存,运行速度也较快。
e.要在Ruby中嵌入C语言编写的代码以提高Ruby代码的运行速度,请参考“Inline”(ttp://sourceforge.net/projects/rubyinline/)。
f.要将Ruby程序代码转换为C程序代码,请参考“rb2c”(ttp://easter.kuee.kyoto-u.ac.jp/~hiwada/ruby/rb2c/)。
g.要集成Ruby和C/C++,请参考“SWIG”(ttp://www.swig.org/)。
h.要集成Ruby和Java,请参考“JRuby”(ttp://jruby.sourceforge.net/)。
i.要集成Ruby和Delphi,请参考“Apollo”(ttp://www.users.yun.co.jp/~moriq/apollo/index-en.html)。
j.要在Ruby中嵌入Python,请参考“Ruby/Python”(ttp://www.ruby-lang.org/en/raa-list.rhtml?name=Ruby%2FPython)。
k.要在Ruby中嵌入Lua,请参考“Ruby-Lua”(ttp://ruby-lua.unolotiene.com/ruby-lua.whtm)。
l.要通过Ruby创建Windows下的可执行程序,请参考“exerb”(ttp://exerb.sourceforge.jp/index.en.html)。
m.要操作原始的二进制位而不是使用Fixnum,请参考“BitVector”(http://www.ce.chalmers.se/~feldt/ruby/extensions/bitvector/)。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者