三、類和模組
1、module#instance_methods, #private_instance_methods, #public_instance_methods module這三個方法都將返回方法名
的symbol組成的陣列,而非過去的字串陣列。
2、module#const_defined?, #const_get 這兩個方法都新增乙個引數flag,用來決定是否將它的ancestor中的const包括在查
找鏈中,例如:
module a; x =1
; def
foo; end end
module b
include a
const_defined? "x
"#=> true
const_defined? "x
",false
#uninitialized constant
const_get "x
"#=> 1
const_get "x
",false
#uninitialized constant
end
3、module#class_variable_defined?方法:
class
x; end
x.class_variable_defined? :@@a
#=> false
class
x; @@a =1
endx.class_variable_defined? :@@a
#=> true
class_variable_方法:
class
b; self end.class_variable_set(:@@a,
"foo
")
#=> "foo"
4、module#attr等價於module#attr_reader:
class
test
attr:foo
definitialize
@foo=3
endendt=
test.new
puts t.foo
#=>3
t.foo=4
#undefined method "foo="
5、接下來是乙個bug fix的問題。下面這段**是為了證明物件的singleton類繼承自物件的類:
class
x;end; x
=x.new;
class
<<
x;p self
<
x; end
在1.8上,這段**列印nil,這是不符合ruby的物件模型的,因此在1.9執行已經可以列印正確結果true了。
如果不理解這點,參照俺過去寫的《ruby物件模型》
6、新增module#module_exec方法,與object#instance_exec類似
7、繫結未繫結的方法時進行額外的子型別檢查,例如下面的**:
class
foo;
deffoo; end end
module bar
define_method(:foo, foo.instance_method(:foo))
enda=""
a.extend bar
a.foo
在1.8上,這段**只有當執行到a.foo的時候才報錯:"foo":bind arguments must be an instance of foo(typeerror)
因為foo是foo的instance method,因此呼叫者必須是foo或者其子類的instance。 而在1.9中,在繫結還沒有繫結的方法的時候引入了額
外的檢查,因此上面這段**不必等到a.foo呼叫就將報錯:
class
foo;
deffoo; end end
module bar
define_method(:foo, foo.instance_method(:foo))
#=》 in "defined_method":bind arguments must be a subclass
of foo
<
typeerror
>
end
8、binding#eval方法,新增加的:a=
1binding.eval(
"p a
")
=>1
這個貌似與1.8中的:a=
1eval("a
",binding)
沒有什麼不同。
Ruby 1 9概要(1)新的語法和語義
一 新的語法和語義 1 新的hash定義語法 例如 等價於 但是 出錯,並不等價於 2 試驗性質的block內的區域性變數 在1.8,block的與外部同名的變數是同乙個變數,也就是說block內的變數也可以修改外部的同名變數,這很容易形成難以查詢的bug。例子 d 2a lambda a.call...
ruby 類和模組
1 所有的類名必須以大寫字母開頭,self關鍵字表示定義的類 類例項 ruby view plain copy class point attr accessor x,y include enumerable def initialize x 0,y 0 x x y y end 這裡並沒有做型別檢查...
Ruby1 9之字串內編碼和外編碼
puts encoding.default external puts encoding.default internal win7下預設輸出 encoding.default external gbk encoding.default internal ruby1.9的字串編碼改動非常大。在rub...