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

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

ただいまの
回答率

90.50%

  • JavaScript

    16431questions

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

  • Ruby

    7675questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 139

kimurayu

score 140

var Sample = {
    aaa: 100,
    bbb: function() {
       console.log('bbb');
    }
};

console.log(Sample.aaa);  // 100
Sample.bbb();             // bbb


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

class Sample
    def aaa
        100
    end
    def bbb
        puts 'bbb'
    end
end

Sample = Sample.new
puts Sample.aaa      # 100
Sample.bbb           # bbb


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

class Sample
    Aaa = 100
    def self.bbb
        puts 'bbb'
    end
end

puts Sample::Aaa   #100
Sample::bbb   # または Sample.bbb   # bbb
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

JavaScriptとRubyでは言語の構成が大きく異なるため同じような動作をするものを作るのにはかなり難しいです。どうしてもJavaScriptのObjectと同様の動作をするようなものをRuby上で作りたいという場合は、下記のような感じになります(これでも完璧ではありません)。

sample = Object.new
class << sample
  def aaa
    100
  end
  def bbb
    puts 'bbb'
  end
  def method_missing(name, *args)
    if name.to_s.end_with?('=')
      method_name = name.to_s.chomp('=')
      method_body = args[0]
      singleton_class.class_eval do
        case method_body
        when Proc, Method, UnboundMethod
          define_method(method_name, method_body)
        else 
          define_method(method_name) do
            method_body
          end
        end
      end
    else
      nil
    end
  end
end

p sample.aaa
sample.bbb

sample.aaa = 200
sample.bbb = proc do |a, b|
  puts a + b
end

p sample.aaa
sample.bbb(2, 3)

sample.ccc = 500
sample.ddd = proc do |x, y|
  x * y
end

p sample.ccc
p 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 16:58

    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    pry内部でさらにpryできる理由

    偶然気づいたんですがpryを既に起動してる状態で更に入れ子構造でpryを起動できるようです。 この機能が実際どういう時に役立つのか全くわからないのですが、何か便利な時があるの

  • 受付中

    コマンドプロンプトで計算ゲームをしたいが、正解率の所でエラーになる件

    ご覧いただきありがとうございます。 現在、コマンドプロンプト(ターミナル)で計算ゲームをするプログラムを作っています(おもに練習用です) まだrubyの勉強初めて一週間

  • 解決済

    配列の要素にメソッドを当てることはできないのでしょうか

    前提・実現したいこと 配列の要素にメソッドを格納して、メソッド配列なるものを作成したいです。 しかしながら、配列の要素にメソッドを格納したのにもかかわらず、randメソッドが無

  • 解決済

    RubyでFizzbuzz問題

    前提・実現したいこと 初めて投稿するので、不備等があり失礼な質問をしてしまうかもしれませんがよろしくお願いします。 Rubyで下記の設定でFizzBuzz問題を解決したいです。

  • 解決済

    JavaScriptのオブジェクト指向

    前提・実現したいこと クラスというものがどのようなものであるか、はっきりと理解できているわけではないのですが、 function内に大量の処理を記述し、それをインスタンス化?するこ

  • 受付中

    条件分岐(if文)の使い方について教えてください。

    はじめましてjavascript初心者です。 この場を借りてご質問させて頂きます。 例えば下記にAの処理とBの処理があります。 Aの処理が実行されない場合はBの処理を実行するように

  • 解決済

    3と3の倍数はアホと叫ぶようにしたい

    いつもお世話になっております。 javascript初心者です。 現在、3と3の倍数になったときに「AHO!」と叫ぶプログラミングを作成しております。 やりたいことは至ってシン

  • 解決済

    ruby 配列のある要素の、隣り合わせの要素を抽出したい

    配列のある要素の、隣り合わせの要素のいずれかを抽出したいです。 例えば、次のような条件なときに、 a = 300 list = [50, 100, 200, 300, 500,

同じタグがついた質問を見る

  • JavaScript

    16431questions

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

  • Ruby

    7675questions

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