Hatena::ブログ(Diary)

Watsonのメモ RSSフィード

2010-11-01

Ruby Stringクラスを Cocoa NSStringクラスで実装したMacRuby

個人的にMacRubyの最大の利点かと思っているのですが、MacRubyではStringクラスをCocoaのNSStringクラスを利用して実装されています。そのおかげで、以下のようにRuby APIとCocoa APIをシームレスに扱うことができます。

  • Ruby APIを使用して文字を連結
$ macruby -e "puts 'abc' + 'def'"
abcdef
  • Cocoa APIを使用して文字を連結
$ macruby -e "puts 'abc'.stringByAppendingString('def')"
abcdef
  • Ruby, Cocoa APIを一緒に使用することもできます
$ macruby -e "puts 'abc'.stringByAppendingString('def') + '0123'"
abcdef0123

$ macruby -e "puts NSString.alloc.initWithString('abc') + '0123'"
abc0123

Rubyの正規表現や、nokogiriなどのライブラリを利用して文字列処理したあとで、Cocoa APIに文字列を直接渡しちゃうことだってできます!


RubyCocoaは、StringクラスとNSStringクラスは別物として実装されているため、

$ ruby -r 'osx/cocoa' -e "puts 'abc'.stringByAppendingString('def')"
 -e:1: undefined method `stringByAppendingString' for "abc":String (NoMethodError)

と怒られちゃいます。

RubyCocoaで同じようなことを行うには、String#to_nsを使用してNSStringに変換する作業が必要になります。

$ ruby -r 'osx/cocoa' -e "puts 'abc'.to_ns.stringByAppendingString('def'.to_ns)"
abcdef


MacRubyでは他にもCocoaのクラスを利用して実装されているRubyのクラスがあります。

RubyクラスCocoaクラス
StringNSString
ArrayNSArray
HashNSDictionary

takumisurftakumisurf 2011/05/24 15:55 はじめまして!
Airmacの停止方法を調べていてこちらを知りました。
コンソールからのコマンドで停止することができ、大変助かりました。

このようなコンソールを使った方法をいろいろご存知のようなので、もし可能でしたら
差し出がましいようですが教えていただければ幸いです。


マックで作ったファイル(イラストレータなど)をLinuxserverにアップするとアクセス権がアップした本人ですら、
権限を失うようで、アップしたファイルを修正しようとローカルにもどそうとしてもアクセス権がない!と
メッセージをだします。

なので、現在はサーバー側でのパーミッションを変更して戻すようにしているのですが、
もともとマックで作成した状態で、自分以外のstaffやeveryoneをデフォルトで読み/書きにすることは
可能でしょうか?

まだまだ知識不足なため非常に困っております。
なお、OSX10.58の環境です。

どうかご指導よろしくおねがいします。

WatsonWatson 2011/05/25 13:19 ファイル共有の為に LinuxServer で使用しているサーバアプリケーションには何を使われているのでしょうか?
Macからファイルをアップできるというので、Samba か netatalk というサーバアプリケーションを使われているのかと思います。
これらのアプリケーションの設定が不十分なのかと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Watson/20101101/1288540994