Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 177 lines (121 sloc) 8.167 kb
af5695f8 »
2006-10-03 import from tar
1 =begin
2 =Ruby/SpiderMonkey
3 -------------------------------------------------
4 nazoking@gmail.com
5 http://nazo.yi.org/rubysmjs/
6 -------------------------------------------------
7
8 Ruby で JavaScript を使うためのモジュールです。
9
10 現在アルファバージョンです。
11 クラス名、メソッド名などが変更される可能性があります。
12
13 ==
14 サーバサイドでJavaScriptが使えると色々幸せだろう。
15
16
17 ==インストール
18 ruby extconf.rb
19 make
20 make install
21
22 ただし、現在まだアルファバージョンなので、インストールしない方がいいでしょう。
23 Debian/sarge 以外で上手く動作した方はご一報ください。
24 Debian/sid , FreeBSD6/ppc でも動いたという報告が
25
26 上手く動作しない方は、上手く動作するようにしてください…
27
28 test.rb はテストコードです。
29
30 ruby test.rb
31
32 で実行します。通らないテストがあっても気にしない!
33 (あるいは、テストが通るように修正してパッチを nazoking@gmail.com まで)
34
35
36 ==使用法
37
38 require "spidermonkey"
39
40 make install していない場合は、require "./spidermonkey" などと、spidermonkey.so の場所をパス付きで指定しましょう。
41
42 SpiderMonkey::evalget("1").to_ruby #=> 1
43
44 のようにできます。
45
46
47 === JavaScriptから見たRubyオブジェクト
48
49  Rubyオブジェクト rbobj は Context::set_property( "name", rbobj )で JavaScript に name として渡すことができます。Rubyから渡されたオブジェクトは、対応するJavaScriptプリミティブ値がある場合、その値に変換されます。ない場合はRubyオブジェクトをラップしたJavaScriptオブジェクトになります。
50
51  Rubyでは、オブジェクトのプロパティーという概念がなく、オブジェクトに対してアクセスできる手段はメソッドのみです。また、JavaScriptにはない概念として、定数という種類の変数があります。Ruby/SpiderMonkeyでは、Rubyオブジェクトをラップする際に、次のようにメソッドとプロパティーが設定されているものとして振る舞います。
52
53 * Rubyの定数 → プロパティー
54 * Rubyのメソッドの内、引数が0個固定のもの → プロパティー
55 * Rubyのメソッドの内、引数が可変あるいは一個以上のもの → メソッド
56
57 この方法の問題点は可変引数0個から複数のメソッドの扱いがわかりにくいことです。が、他に方法が思いつかなかったので、現状こうなっています。
58
59
60 ==リファレンス
61
62 SpiderMonkey では、ランタイムを作成し、ランタイム上でコンテキストを作成し、そのコンテキストに対してスクリプトを実行します。
63 が、手間がかかるため、ランタイムはモジュールがロードされた時点で作成されます。また、default_context というコンテキストを用意し、SpiderMonkeyクラスオブジェクトに対してメッセージを投げ、該当するメソッドが SpiderMonkeyクラスオブジェクトにない場合、デフォルトコンテキストに委譲されます。
64
65 同じく Contextオブジェクトのメソッドも、該当するものがない場合、globalオブジェクトに委譲されます。
66
67 === SpiderMonkey
68
69 :SpiderMonkey::LIB_VERSION
70 SpiderMonkeyのバージョンが文字列で返ります
71
72 :SpiderMonkey::eval( code )
73 デフォルトコンテキスト上で javascript-code をevalします。
74 結果の SpiderMonkey::Value が返ります。
75
76 :SpiderMonkey::evaluate( code )
77 デフォルトコンテキスト上で javascript-code をevalします。
78 結果の Rubyオブジェクト が返ります。
79 SpiderMonkey::evalate( code ).to_ruby
80 と同意です
81
82 === SpiderMonkey::Context
83 コンテキスト情報のラッパークラスです。
84
85 :SpiderMonkey::Context.new( stack_size=8192 )
86 新しいコンテキストを作成します。
87
88 :SpiderMonkey::Context#eval( code )
89 Javascriptコード code を、コンテキスト上で実行します。
90 結果がプリミティブ値の場合、対応するRubyのオブジェクトが返ります。
91 結果がオブジェクトの SpiderMonkey::Value が返ります。
92 結果が Ruby から渡されたオブジェクトであった場合、元のRubyオブジェクトが返ります。
93
94 :SpiderMonkey::Context#eval( code )
95 Javascriptコード code を、コンテキスト上で実行します。
96 結果の SpiderMonkey::Value が返ります。
97
98 :SpiderMonkey::Context#evaluate( code )
99 Javascriptコード code を、コンテキスト上で実行します。
100 結果の Rubyオブジェクトが返ります。
101 SpiderMonkey::Context#evalget( code ).to_ruby
102 と同意です
103
104 :SpiderMonkey::Context#version
105 ContextのJavaScriptのバージョンを文字列で返します。
106
107 :SpiderMonkey::Context#version=
108 ContextのJavaScriptのバージョンを文字列で設定します。
109 設定できないバージョンの場合は SpiderMonkey::Error が発生します。
110
111 :SpiderMonkey::Context#gc()
112 ガベレージコレクションを発生させます。主にデバッグ用
113
114 :SpiderMonkey::Context#running?
115 eval 実行中ならtrueを返します。コールバック関数中にrubyが呼ばれたなら trueになります。
116
117 :SpiderMonkey::Context#global
118 globalオブジェクトのSpiderMonkey::Valueラッパーを返します。
119
120 === SpiderMonkey::Value
121 JavaScriptオブジェクトのRubyラッパーです。
122 JavaScriptから渡される値は、プリミティブ値以外はこのクラスにラップされます。
123
124 :SpiderMonkey::Value#to_ruby
125 適当なRubyオブジェクトに変換して返します。
126 undefined および null は nil に変換されます。
127 ObjectはHashに、ArrayはArrayに変換されます。
128 ObjectやArrayの子(プロパティー)も含めて変換します。
129 function型、function型を含むObjectを変換しようとすると ConvertError が発生します。
130 Rubyから渡されてきたオブジェクトは元のRubyオブジェクトになります。
131 JavaScript上でArrayに個別のプロパティーを設定しても、その値は変換されません。
132
133 :SpiderMonkey::Value#to_a
134 Rubyの Array にして返します。
135 JavaScript の Array以外のものは適当なオブジェクトにした後に to_a メソッドを呼び出します。
136 JavaScript上でArrayに個別のプロパティーを設定しても、その値は変換されません。
137 JavaScriptの関数は変換できません。(SpiderMonkey::ConvertError が起こります)
138
139 :SpiderMonkey::Value#to_i
140 Rubyの Integer にして返します。
141
142 :SpiderMonkey::Value#to_f
143 Rubyの Float にして返します。
144
145 :SpiderMonkey::Value#to_num
146 Rubyの Integer または Float にして返します。
147
148 :SpiderMonkey::Value#to_h
149 Rubyの Hashにして返します。
150 オブジェクト以外は例外を返します。
151 関数を含むオブジェクトは変換できません。
152
153 :SpiderMonkey::Value#to_bool
154 true または false が返ります。JavaScript基準で変換されるので、空文字、0などはfalse になります。
155
156 :SpiderMonkey::Value#typeof
157 typeof x をJavaScript上で行い、その結果の文字列を返します。
158
159 :SpiderMonkey::Value#function( name , &proc )
160 JavaScriptオブジェクトに name という名前で関数を定義します。
161 その関数が呼ばれると、proc が実行されます
162
163 :SpiderMonkey::Value#call( name , args... )
164 JavaScriptオブジェクトの関数を呼び出します。
165 args が引数になります。
166 返値は SpiderMonkey::Value です
167
168 :SpiderMonkey::Value#set_property( name, value )
169 JavaScriptオブジェクトに name という名前でプロパティーを定義します。
170
171 :SpiderMonkey::Value#get_property( name )
172 JavaScriptオブジェクトの name という名前のプロパティーを取得します。
173 SpiderMonkey::Value オブジェクトが返ります。
174
175 =end
176
Something went wrong with that request. Please try again.