Ruby是一种动态的语言,下面的几个例子将展示Ruby的动态特性。
先看第一个例子:
$ irb
irb(main):001:0> class Hello
irb(main):002:1> end
=> nil
irb(main):003:0> hello = Hello.new
=> #<Hello:0xb7f36cb4>
irb(main):004:0> hello.hi
NoMethodError: undefined method `hi' for #<Hello:0xb7f36cb4>
from (irb):4
from :0
irb(main):005:0> class Hello
irb(main):006:1> def hi
irb(main):007:2> puts "hello, world"
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> hello.hi
hello, world
=> nil
在这个例子中,我们先定义一个“空”的Hello类,所以,当我们对它的实例hello调用hi方法时会报错。接着,我们把一个hi方法的定义塞进Hello类里面,然后再调用hi。这个例子说明,Ruby的类很像C++中的名字空间,我们可以随时打开它的作用域,向里面加点东西,然后再关闭它。不过,在Ruby里,我们可以做更多的事,比如:
irb(main):011:0> class Hello
irb(main):012:1> private :hi
irb(main):013:1> end
=> Hello
irb(main):014:0> hello.hi
NoMethodError: private method `hi' called for #<Hello:0xb7f36cb4>
from (irb):14
from :0
虽然hi方法还在,但是已经不能通过hello来调用它了,因为它已经变成一个私有的方法。不过,我们仍然可以在类里面调用它。
irb(main):015:0> class Hello irb(main):016:1> def bye irb(main):017:2> hi irb(main):018:2> end irb(main):019:1> end => nil irb(main):020:0> hello.bye hello, world => nil
接下来的事情更令人惊讶:
irb(main):021:0> class Hello
irb(main):022:1> undef bye
irb(main):023:1> end
=> nil
irb(main):024:0> hello.bye
NoMethodError: undefined method `bye' for #<Hello:0xb7f36cb4>
from (irb):24
from :0
我们甚至删除了一个方法!更要命的是,我们不仅可以对自己写的类做这样的事,还可以对Ruby的标准类做同样的事。说实话,我还是第一次接触拥有这种特性的语言,想象不出它有怎样的用处(正面的),尤其是删除一个方法。虽然我愿意抱着开放的心态接受这种特性,但是我相信,它会让很多经理们疯狂,他们绝不愿意把这样一种语言用在他们的项目里。那么,究竟是怎样的一群人在使用Ruby呢?






其实python也可以做到