JavaScriptとRubyでは言語の構成が大きく異なるため同じような動作をするものを作るのにはかなり難しいです。どうしてもJavaScriptのObjectと同様の動作をするようなものをRuby上で作りたいという場合は、下記のような感じになります(これでも完璧ではありません)。
Ruby
1sample = Object.new
2class << sample
3 def aaa
4 100
5 end
6 def bbb
7 puts 'bbb'
8 end
9 def method_missing(name, *args)
10 if name.to_s.end_with?('=')
11 method_name = name.to_s.chomp('=')
12 method_body = args[0]
13 singleton_class.class_eval do
14 case method_body
15 when Proc, Method, UnboundMethod
16 define_method(method_name, method_body)
17 else
18 define_method(method_name) do
19 method_body
20 end
21 end
22 end
23 else
24 nil
25 end
26 end
27end
28
29p sample.aaa
30sample.bbb
31
32sample.aaa = 200
33sample.bbb = proc do |a, b|
34 puts a + b
35end
36
37p sample.aaa
38sample.bbb(2, 3)
39
40sample.ccc = 500
41sample.ddd = proc do |x, y|
42 x * y
43end
44
45p sample.ccc
46p sample.ddd(2, 3)
違いはたくさんあるのですが、大きい所を指摘します。
- Rubyはクラスベースオブジェクト指向、JavaScriptはプロトタイプベースオブジェクト指向。プロトタイプベースの方が柔軟であり、クラスベースをエミュレートすることができる(ES6からのclass構文がこれである)が、クラスベースでプロトタイプベースをエミュレートすることは難しい。
a.b
という表記について、Rubyは常にメソッド呼び出しであり暗黙の()
がついていると見なされる。対して、JavaScriptはプロパティの取得(get)であり、()
がないとメソッド(プロパティであるところの関数)呼び出しにはならない。
a.b=
という表記について、Rubyはb=
というメソッドの呼び出しとみなされる。対して、JavaSriptではプロパティの設定(set)であり、プロパティ毎デフォルトでは置き換えになる。
- Rubyでは、インスタンス(オブジェクト)がメソッドを直接持てない。そのインスタンス専用のメソッドは特異クラスに定義する必要がある。インスタンスが持ているのはインスタンス変数のみである。
- JavaScriptでは、インスタンス変数というものがない(クロージャーで擬似的に実現は可能)。オブジェクトが持つものはプロパティのみであり、プロパティの値が関数であるものをメソッドと呼ぶに過ぎない。
クラスベースとプロトタイプベースの違いも大きいのですが、それよりも大きいのは、インスタンス変数、メソッド、プロパティの違いについてです。Rubyはインスタンスがインスタンス変数を、クラスがメソッドを持ちます。JavaScriptはプロパティしかありません(JavaScriptでのメソッドはプロパティの一種です)。それぞれ似たような機能を提供はするのですが、本質的な実装方法が異なっているため、完全に同じように扱う事はできません。
設計していく上での構成を言語に合わせない限り、JavaScriptでの書き方をRubyに適用する方法では限界が来ると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/21 07:58