また、Objective-c から Ruby コードを呼び出すことに興味がある場合は、MacRuby メーリング リストからの抜粋を次に示します。
MacRuby ランタイムが初期化されると、Ruby からすべての Objective-C オブジェクトにアクセスできるようになります。たとえば、Foo という名前の Objective-C クラスがある場合、「Foo.new」などを実行できます。
もう 1 つの可能性は、 を使用して、Objective-C オブジェクトを Ruby メソッドに渡すこと[NSObject performRubySelector:]
です。
ルビー:
class Foo
def test(o)
o.something
end
end
オブジェクト:
MyObject *o = [MyObject new]; // where o responds to -something
MacRuby *runtime = [MacRuby sharedRuntime];
id foo_obj = [runtime evaluateString:@"new Foo"];
[foo_obj performRubySelector:@selector(test:) withArguments: o, NULL];
ここで API 全体を確認してください: http://www.macruby.org/trac/browser/MacRuby/trunk/include/ruby/objc.h
スレッド: http://lists.macosforge.org/pipermail/macruby-devel/2010-April/004715.html
(編集) とはいえ、おそらく最も簡単な方法は、Ruby ファイルに対応するメソッドを含むヘッダー ファイルを追加することです。
次の Ruby クラスがあるとします。
class Foo
def bar(moo)
"a string like #{moo}"
end
end
したがって、同等のヘッダー ファイルは次のようになります。
@interface Foo : NSObject
- (NSString *)bar:(NSString *)moo
@end
次に、ヘッダーだけ#import
を追加し、Obj-C コード内から標準の Obj-C クラスとして Ruby クラスを使用します。
NSString *aString;
Foo *myFoo;
aString = [myFoo bar:@"me"];
奇妙に思えるかもしれませんが、うまくいきます。本質的には、コンパイラの口を閉じて、メソッドの欠落について文句を言わずにコードをコンパイルさせるという考え方です。その後、実行時に機能します (Obj-C 自体の動的な性質のおかげだと思います)。ところで、Ruby の typeless 動作を模倣するために、ヘッダー ファイルにメソッド シグネチャを記述する際に id を使用します。