質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1461閲覧

Javascript オブジェクト -> Ruby での書き方

kimurayu

総合スコア158

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/10/21 02:57

編集2022/01/12 10:55

javascript

1var Sample = { 2 aaa: 100, 3 bbb: function() { 4 console.log('bbb'); 5 } 6}; 7 8console.log(Sample.aaa); // 100 9Sample.bbb(); // bbb

Javascript ではオブジェクトに数値と関数を混在できますが、
ruby ではこう書くのが一番近いですか?

ruby

1class Sample 2 def aaa 3 100 4 end 5 def bbb 6 puts 'bbb' 7 end 8end 9 10Sample = Sample.new 11puts Sample.aaa # 100 12Sample.bbb # bbb

また、これはどうですか?

ruby

1class Sample 2 Aaa = 100 3 def self.bbb 4 puts 'bbb' 5 end 6end 7 8puts Sample::Aaa #100 9Sample::bbb # または Sample.bbb # bbb

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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:33

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimurayu

2017/10/21 07:58

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問