Ruby 1 9概要(3)類和模組

2021-08-29 17:06:57 字數 2426 閱讀 2313

三、類和模組

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...