Ruby Practice – Dynamicity

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呢?

One thought on “Ruby Practice – Dynamicity

回复 Cheng Meng 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据