用40行程序能展示多少Ruby的特性?

2007年8月22日 | Author: zhangdi | 标签: , ,

module OutputHelper
  def print_line(msg)
    print msg + "\\n"
  end
end

class SayHello
  include OutputHelper
  private :print_line
  def initialize(name, &sayHello)
    @name, @sayHello = name, sayHello

    if @sayHello == nil
      @sayHello = proc { |msg| print_line msg }
    end
  end

  def salute(greet_msg)
    @sayHello.call("Hello, #{@name}. #{greet_msg}.")
  end

  def salute_with_block(greet_msg)
    if block_given?
      yield "Hello, #{@name}. I'm using a block. #{greet_msg}."
    else
      @sayHello.call("Hello, #{@name}. You missed the block. #{greet_msg}.")
    end
  end
end

if __FILE__ == $0
  say_hello = SayHello.new("Daniel") { |msg| print msg + "\\n" }
  say_hello.salute("Greetings")
  say_hello.salute_with_block("Greetings")
  say_hello.salute_with_block("Greetings") { |msg| print msg + "\\n" }

  say_hello = SayHello.new("Kimi")
  say_hello.salute("Greetings, again")
end
  • 定义module以及class。
  • Mixin,将一个module动态include到class里面,使之具有相应的功能。
  • method的访问级别,private, public等。很多动态语言没有这个功能。
  • 向构造函数传入block类型的参数。
  • 用proc方法构造block。
  • 用block.call方法,调用一个block类型的变量。
  • 用block_given?方法判断是否为一个方法传入了block参数。
  • 用yield来调用为方法传入的block参数。
  • 将测试代码写在if __FILE__ = $0 … end块中。很类似于Python。
  • 用{|params| expressions }形式定义block。
  1. Tao Wu
    2007年8月22日19:52

    Faulting application iexplore.exe, version 6.0.2900.2180, faulting module kernel32.dll, version 5.1.2600.2945, fault address 0x00012a5b.

    For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

    Event ID 1000

    我的IE6访问你的BLOG会报错…FIREFOX就没问题了. 以上是ERROR EVENT.

  2. 2007年8月22日23:58

    我用简体中文版的IE6.0没有问题啊~你用的是sp2的么?
    竟然在kernel32里面出错了,太诡异了。

  3. Tao Wu
    2007年8月23日17:09

    看了一下,装了SP2了 :)

  4. 2007年8月23日21:19

    一般来说,IE crash都是因为你中了流氓软件或者病毒了~(MS想让IE6sp2更安全,结果就更安全的crash了)
    你需要仔细检查一下。

    IE7是除了Firefox的一个比较好的选择。(Opera也不错了,目前)

  5. 2008年3月31日00:51

    代码插件超级漂亮,能否介绍一下.
    如果方便,给我回个邮件好了.谢谢.

  6. 2008年3月31日00:54

    还有就是我订阅了你的Blog了,BZ继续努力