- 論壇徽章:
- 0
|
ruby好多地方借鑒了Perl,但OO實(shí)現(xiàn)的比perl好的多~~
說幾點(diǎn)偶喜歡ruby的地方:
(1)類都是開放式的,很容易擴(kuò)展。
irb(main):001:0> class String
irb(main):002:1> def myhi
irb(main):003:2> puts "hi my world"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> x="hello"
=> "hello"
irb(main):007:0> x.myhi
hi my world
=> nil
如上就方便的在String類里擴(kuò)展了一個(gè)myhi方法(實(shí)例方法)。
x是String的一個(gè)實(shí)例,它能訪問到這個(gè)方法。
(2)單態(tài)類(singleton class),很靈活。
任何目標(biāo)都可定義一個(gè)私有方法,它們只屬于這個(gè)目標(biāo)自身。
irb(main):008:0> def x.oops
irb(main):009:1> puts "oops it's me"
irb(main):010:1> end
=> nil
irb(main):011:0> x.oops
oops it's me
=> nil
x這個(gè)目標(biāo)(String的實(shí)例),可以加載一個(gè)oops方法,它只屬于x自身。
如下"s"也是String的實(shí)例,但它就沒有這個(gè)方法。
irb(main):012:0> "s".oops
NoMethodError: undefined method `oops' for "s":String
from (irb):12
from /usr/bin/irb:12:in `<main>'
類自身是Class類的實(shí)例,所以它也是一個(gè)目標(biāo),可以定義類私有方法。
irb(main):013:0> class Myclass
irb(main):014:1> end
=> nil
irb(main):015:0> def Myclass.echo
irb(main):016:1> puts "hello world"
irb(main):017:1> end
=> nil
irb(main):018:0> Myclass.echo
hello world
=> nil
當(dāng)然目標(biāo)還可以擴(kuò)充Module里的方法,很好很強(qiáng)大。
irb(main):019:0> module Foo
irb(main):020:1> def greet
irb(main):021:2> puts "Hello, #{self}!"
irb(main):022:2> end
irb(main):023:1> end
=> nil
irb(main):024:0> x.extend Foo
=> "hello"
irb(main):025:0> x.greet
Hello, hello!
(3)block的使用
ruby將block的使用發(fā)揮到極致,沒有block,ruby無法運(yùn)行。
block就是代碼塊,它類似于perl里的匿名函數(shù),或者python里的lambda。
ruby里的函數(shù)如此廣泛的使用block,正是由于其強(qiáng)大與靈活。
例如數(shù)組或hash的delete_if方法和select/find方法等,接受一個(gè)block作為參數(shù),從而使得條件刷選如此容易。
如下偶自己定義一個(gè)方法,它接受一個(gè)hash和一個(gè)block,來實(shí)現(xiàn)類似hash.find的功能。
irb(main):105:0* def myfunc(a)
irb(main):106:1> newhash=Hash.new
irb(main):107:1> if block_given?
irb(main):108:2> a.each do |k,v| newhash[k] = v if yield k,v end
irb(main):109:2> else
irb(main):110:2* raise "no block was given"
irb(main):111:2> end
irb(main):112:1> newhash
irb(main):113:1> end
=> nil
irb(main):114:0> x
=> {1=>2, 3=>4, 5=>6, 7=>8}
irb(main):116:0> myfunc(x) do |c,d| c>2 end
=> {3=>4, 5=>6, 7=>8} |
評(píng)分
-
查看全部評(píng)分
|