MacRuby 0.3 发布,支持 Interface Builder,和创建 GUI 用的 HotCocoa

  • Werner Schuster
  • 贾晓楠

2008 年 9 月 24 日

话题:RubyApple语言 & 开发

现在,MacRuby 0.3已经可以用了。

一个较大的变化是方法调度器,它现在完全基于 Objective-C 运行时。MacRuby 现在使用 Objective-C 运行时来实现 Ruby 的类语义,并调度纯 Ruby 方法。这是个非常重要的变化,因为这不仅简化了大量的内核实现,还让两个世界之间的界限更加清晰。

 [..]

在纯 Ruby 的方面,修复了很多 bug,我们现在可以运行一些 RubyGems 命令,还可以安装简单的 gem。但不要指望 MacRuby 能运行 Rails!

MacRuby 现在支持用Cocoa来创建GUI—— 实际上创建 GUI 有两种方法。一种是使用和 Apple's XCode 相配套的 Interface Builder(IB)。用 IB 创建的 GUI 可以通过 action 和 outlet(GUI 元件收发消息用的)来连接到 Ruby 类。MacRuby 提供了一 个用 Ruby 写的工具来创建必要的元数据,用来映射到 Ruby 代码构造器,例如从 accessor 和 method 映射到 action 和 outlet。

rb_nibtool是用 Ruby 写的,还使用了 Ruby 1.9 的Ripper库。Ripper 使用 Ruby 源,让它能被 Ruby 代码访问——要么作为 Lexer 标记流,要么作为 s 表达式(相当于 ParseTree,不过 Ruby 1.9 里还没有)。rb_nibtool 根据 Ruby 源文件为.nib 文件提供类名;attr_accessorattr_writer和其它一些调用被解释为 outlet,一个标识符跟一个 ib_action 定义为一个 action。最终,这些收集到的信息汇入一个.nib 文件,把 GUI 定义和 Ruby 代码连接起来。

顺便提一句:使用 MacRuby 和 Interface Builder 创建 GUI 是在 OS X 上的 Ruby 的一个选择——而在 Windows 上,Ruby In Steel IDE 能帮助 Visual Studio 创建 GUI,要通过 Ruby Connector 使用 IronRuby 或 MRI。

另一种创建 GUI 的方法是HotCocoa,它随 MacRuby 一起提供,可以使用创建器的理念来创建 GUI,类似于一些其它的 Ruby 工具,比如Ruby Shoes,以及其它 Ruby GUI 库。大致了解一下 HotCocoa 的实现,看看创建方法名是如何映射到 Cocoa GUI 控件上的。到现在为止,关于 HotCocoa 的文档几乎没有,因此唯一能参考的就是随 MacRuby 一起提供的 HotCocoa 源码和例程。

和其它 Ruby 工具包一样,HotCocoa 附带了一个用来建立程序框架的工具:



hotcocoa classlist 
该命令用来创建一个新程序,连同必须的库和设置。

HotCocoa 程序是什么样子的呢?这里有一个简短的示例,用来列出所有加载的类及其父类的表格。这段代码建立了一个 GUI——请把代码复制到 HotCocoa 创建的程序框架中的lib/application.rb文件中:

def start

 application :name => "Classlist" do |app|

 app.delegate = self

 window :frame => [100, 100, 500, 500], :title => "Classlist" do |win|

# Add a button to - clicking shows the data in the table

win << button(:title => "Show classes", :bezel => :regular_square).on_action {

klasses = []

ObjectSpace::each_object(Class){|x|

 klasses << {:klass => x.to_s, :ancestors => x.ancestors.join(',')}

}

@table.data = klasses

 }

 # create the table

@table = table_view(

 :columns => [

column(:id => :klass, :text => "Class"),

 column(:id => :ancestors, :text => "Ancestors")

] )

# put the table inside a scroll view

win << scroll_view(:layout => {:expand => [:width, :height]}) do |scroll|

scroll << @table

end

win.will_close { exit }

end

end

end
Rake 文件负责程序运行的所有细节——要运行它,执行:

macrake  
要了解关于 MacRuby 的更多信息,请关注InfoQ 对 Laurent Sansonetti 的访谈

查看原文MacRuby 0.3 Release Brings Interface Builder Support, HotCocoa for GUI Building

RubyApple语言 & 开发