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也可以做到