- 論壇徽章:
- 0
|
ruby好多地方借鑒了Perl,但OO實現(xiàn)的比perl好的多~~
說幾點偶喜歡ruby的地方:
(1)類都是開放式的,很容易擴展。
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類里擴展了一個myhi方法(實例方法)。
x是String的一個實例,它能訪問到這個方法。
(2)單態(tài)類(singleton class),很靈活。
任何目標都可定義一個私有方法,它們只屬于這個目標自身。
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這個目標(String的實例),可以加載一個oops方法,它只屬于x自身。
如下"s"也是String的實例,但它就沒有這個方法。
irb(main):012:0> "s".oops
NoMethodError: undefined method `oops' for "s":String
from (irb):12
from /usr/bin/irb:12:in `<main>'
類自身是Class類的實例,所以它也是一個目標,可以定義類私有方法。
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
當然目標還可以擴充Module里的方法,很好很強大。
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無法運行。
block就是代碼塊,它類似于perl里的匿名函數(shù),或者python里的lambda。
ruby里的函數(shù)如此廣泛的使用block,正是由于其強大與靈活。
例如數(shù)組或hash的delete_if方法和select/find方法等,接受一個block作為參數(shù),從而使得條件刷選如此容易。
如下偶自己定義一個方法,它接受一個hash和一個block,來實現(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} |
評分
-
查看全部評分
|