From b8c6d635d37b97cf3c3b8b8587051717ffa9b125 Mon Sep 17 00:00:00 2001 From: SHIMADA Koji Date: Sun, 24 Apr 2016 13:30:47 +0900 Subject: [PATCH] Translate ruby-from-other-languages(ja) --- _config.yml | 6 +- ja/documentation/index.md | 2 + .../ruby-from-other-languages/index.md | 441 ++++++++++++++++++ .../to-ruby-from-c-and-cpp/index.md | 121 +++++ .../to-ruby-from-java/index.md | 52 +++ .../to-ruby-from-perl/index.md | 63 +++ .../to-ruby-from-php/index.md | 43 ++ .../to-ruby-from-python/index.md | 77 +++ 8 files changed, 802 insertions(+), 3 deletions(-) create mode 100644 ja/documentation/ruby-from-other-languages/index.md create mode 100644 ja/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md create mode 100644 ja/documentation/ruby-from-other-languages/to-ruby-from-java/index.md create mode 100644 ja/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md create mode 100644 ja/documentation/ruby-from-other-languages/to-ruby-from-php/index.md create mode 100644 ja/documentation/ruby-from-other-languages/to-ruby-from-python/index.md diff --git a/_config.yml b/_config.yml index a99d56d03c..c6f26d71b6 100644 --- a/_config.yml +++ b/_config.yml @@ -1150,9 +1150,9 @@ locales: quickstart: text: 20分ではじめるRuby url: /ja/documentation/quickstart/ -# ruby_from_other_languages: -# text: Ruby from Other Languages -# url: /ja/documentation/ruby-from-other-languages/ + ruby_from_other_languages: + text: 他言語からのRuby入門 + url: /ja/documentation/ruby-from-other-languages/ explore: text: 探求しよう documentation: diff --git a/ja/documentation/index.md b/ja/documentation/index.md index 3ef8db409e..8351b1519e 100644 --- a/ja/documentation/index.md +++ b/ja/documentation/index.md @@ -34,6 +34,8 @@ lang: ja [20分ではじめるRuby](/ja/documentation/quickstart/) : Rubyの基本をカバーしている便利なチュートリアルです。始めから終わりまで読んでも20分かからないでしょう。 +[他言語からのRuby入門](/ja/documentation/ruby-from-other-languages/) +: 他の言語からRubyにやってきましたか?C、C++、Java、Perl、PHP、Pythonといった言語から来たのであれば、この記事が役に立つはずです! ### リファレンス diff --git a/ja/documentation/ruby-from-other-languages/index.md b/ja/documentation/ruby-from-other-languages/index.md new file mode 100644 index 0000000000..de5b49a4d0 --- /dev/null +++ b/ja/documentation/ruby-from-other-languages/index.md @@ -0,0 +1,441 @@ +--- +layout: page +title: "他言語からのRuby入門" +lang: ja +--- + +Rubyのコードを目にすると、 +他の言語と似た部分があることに気が付くはずです。 +構文の多くは、(他の言語の中でも特に)PerlやPython、 +Javaプログラマーにとって馴染みのあるものになっています。 +もしあなたがそうした言語に慣れ親しんでいるのなら、 +Rubyを学ぶのはおそらくどうってことないはずです。 +{: .summary} + +このドキュメントは2部構成になっています。 +このページでは、プログラミング言語*X*からRubyへ移ってくる際に役立つ情報をざっと紹介します。 +個別のページでは、Rubyの主な言語機能を紹介しつつ、 +あなたが慣れ親しんできた言語との比較を行います。 + +## 求められていること: *言語X*からRubyへ + +* [C・C++からRubyへ](/ja/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/) +* [JavaからRubyへ](/ja/documentation/ruby-from-other-languages/to-ruby-from-java/) +* [PerlからRubyへ](/ja/documentation/ruby-from-other-languages/to-ruby-from-perl/) +* [PHPからRubyへ](/ja/documentation/ruby-from-other-languages/to-ruby-from-php/) +* [PythonからRubyへ](/ja/documentation/ruby-from-other-languages/to-ruby-from-python/) + +## 重要な言語機能と知っておくべきこと + +ここでは、Rubyを学習する中で出会ういくつかの主要な機能について、 +参照先やヒントを示します。 + +### イテレーション + +Rubyの特徴であるブロックとイテレータは、 +これまでにあまり見たことがない、あるいは使い慣れていないものかもしれません。 +(CやC++、1.5以前のJavaのような)インデックスを使った繰り返し処理や、 +(Perlの`for (@a) {...}`やPythonの`for i in aList: ...`のような) +リストをループする処理の代わりに、 +Rubyでは次のようなコードをよく見ることになるでしょう。 + +{% highlight ruby %} +some_list.each do |this_item| + # ここはブロックの中になります。 + # this_itemを扱う処理をここに書きます。 +end +{% endhighlight %} + +`each`(や`collect`、`find`、`inject`、`sort`など)について詳しくは、 +`ri Enumerable`を参照してみてください(そして、次に +`ri Enumerable#some_method`として具体的なメソッドを参照してみてください)。 + +### すべては値 + +式と文に違いはありません。 +すべては値を持ちます。`nil`であっても例外ではありません。 +Rubyでは次のように書くことが可能です。 + +{% highlight ruby %} +x = 10 +y = 11 +z = if x < y + true + else + false + end +z # => true +{% endhighlight %} + +### シンボルは軽量文字列ではない + +多くのRuby初学者はシンボルが何であるか、どう使えばよいのかを理解するのに苦戦します。 + +シンボルは識別子として記述するのに適しています。 +シンボルは、**どんな物か**ではなく、**何者であるか**がすべてです。 +`irb`を立ち上げて、次の違いを見てみてください。 + +{% highlight irb %} +irb(main):001:0> :george.object_id == :george.object_id +=> true +irb(main):002:0> "george".object_id == "george".object_id +=> false +irb(main):003:0> +{% endhighlight %} + +`object_id`メソッドはオブジェクトのIDを返します。 +もし二つのオブジェクトが同じ`object_id`を持っていれば、 +それらはメモリ上の同じ実体を指すものであると言えます。 + +上記で見たとおり、一度でもシンボルを使ったなら、 +同じ文字からなるシンボルは、いずれもメモリ内の同じオブジェクトを参照します。 +同じ文字で表された2つのシンボルは、同じ`object_id`を指します。 + +次に文字列("george")の方を見てみましょう。 +`object_id`は一致していません。 +これは、二つの文字列が異なる実体を指していることを示しています。 +新しい文字列を使うと、Rubyは毎回その文字列のために新しいメモリ領域を確保します。 + +シンボルを使うか文字列を使うかで迷ったなら、 +ハッシュのキーのようにオブジェクトを識別したいのか、 +それとも前述の"george"などのようにコンテンツを表したいのかを、 +選択の指針にしてください。 + +### すべてはオブジェクト + +「すべてはオブジェクト」は誇張ではありません。 +クラスや整数でさえオブジェクトです。 +他のオブジェクトと同じように扱うことができます。 + +{% highlight ruby %} +# 以下のクラス定義と同じことを行っています +# class MyClass +# attr_accessor :instance_var +# end +MyClass = Class.new do + attr_accessor :instance_var +end +{% endhighlight %} + +### 可変な定数 + +定数は厳密な意味での定数ではありません。 +初期化済みの定数を変更したとしても、 +警告はされますが、プログラムは停止しません。 +だからと言って、定数を再定義するべきだということではありません。 + +### 名前付けの規約 + +Rubyにはいくつか名前付けについての規約があります。 +大文字から始まる識別子は定数です。 +ドルマーク(`$`)から始まる識別子はグローバル変数、 +`@`から始まる識別子はインスタンス変数、 +`@@`から始まる識別子はクラス変数になります。 + +メソッド名は大文字から始めることもできます。 +けれど、それは次のような混乱を招くことになるでしょう。 + +{% highlight ruby %} +Constant = 10 +def Constant + 11 +end +{% endhighlight %} + +こうすると、`Constant`は10ですが、`Constant()`は11になります。 + +### キーワード引数 + +メソッドはRuby2.0から、Pythonのように、 +キーワード引数を定義できるようになりました。 + +{% highlight ruby %} +def deliver(from: "A", to: nil, via: "mail") + "Sending from #{from} to #{to} via #{via}." +end + +deliver(to: "B") +# => "Sending from A to B via mail." +deliver(via: "Pony Express", from: "B", to: "A") +# => "Sending from B to A via Pony Express." +{% endhighlight %} + +### 普遍の真理 + +Rubyでは、`nil`と`false`を除くすべてのものは真と評価されます。 +CやPythonを始めとする多くの言語では、0あるいはその他の値、空のリストなどは +偽と評価されます。次に示すPythonコードをみてください +(他の言語でもだいたい同じようなコードになるでしょう)。 + +{% highlight python %} +# Python版 +if 0: + print("0 is true") +else: + print("0 is false") +{% endhighlight %} + +このコードを実行すると「0 is false」と出力されます。 +同じコードをRubyで書くと以下のようになります。 + +{% highlight ruby %} +# Ruby版 +if 0 + puts "0 is true" +else + puts "0 is false" +end +{% endhighlight %} + +このコードを実行すると、 +「0 is true」が出力されることになります。 + +### アクセス修飾子はスコープの最後まで適用される + +次のRubyコードを見てください。 + +{% highlight ruby %} +class MyClass + private + def a_method; true; end + def another_method; false; end +end +{% endhighlight %} + +`another_method`がpublicメソッドになることを期待するかもしれませんが、 +結果はそうなりません。 +`private`アクセス修飾子はスコープの終わりか、他のアクセス修飾子が +あらわれるまで継続されます。 +デフォルトでは、メソッドはpublicになります。 + +{% highlight ruby %} +class MyClass + # a_methodはpublicです + def a_method; true; end + + private + + # another_methodはprivateです + def another_method; false; end +end +{% endhighlight %} + +`public`、`private`、`protected`は実際にはメソッドになるので、 +引数を受けることができます。これらにシンボルを渡した場合には、 +そのメソッドの可視性が変更されます。 + +### アクセス制御 + +Javaでは、`public`は誰でもアクセスできることを意味しています。 +そして、`protected`はクラスおよび継承関係にあるクラスのインスタンス、 +クラスと同じパッケージにあるクラスのインスタンスからアクセスできること、 +`private`はクラスのインスタンスからのみアクセスできることを、 +ぞれぞれ意味します。 + +Rubyでは扱いが若干異なります。 +`public`はそのままの意味になります。 +`private`は、レシーバなしで呼び出すことができる場合に、 +そのメソッドへアクセス可能となります。 +つまり、`self`のみがprivateメソッドを呼び出す際のレシーバとなります。 + +`protected`は気をつけて扱う必要があります。 +protectedメソッドはクラスか継承関係にあるクラスのインスタンスからのみ +呼び出すことができます。しかしまた、 +レシーバとしてインスタンスを指定しても呼び出すことができてしまいます。 +以下に例を示します([The Ruby Language FAQ][faq]から引用)。 + +{% highlight ruby %} +class Test + # デフォルトはpublic + def identifier + 99 + end + + def ==(other) + identifier == other.identifier + end +end + +t1 = Test.new # => # +t2 = Test.new # => # +t1 == t2 # => true + +# ここで`identifier'をprotectedにする。 +# protected はレシーバとして`other'を許容するため、これは動作する。 + +class Test + protected :identifier +end + +t1 == t2 # => true + +# ここで`identifier'をprivateにする。 + +class Test + private :identifier +end + +t1 == t2 +# NoMethodError: private method `identifier' called for # +{% endhighlight %} + +### クラスは開いている + +Rubyのクラスは開いています。 +いつでもクラスを開いて、定義を足したり、変更することができます。 +`Fixnum`や、すべてのオブジェクトの祖先である`Object`のようなクラスであっても、 +自由に再定義することが可能です。Ruby on Railsは、次のような +`Fixnum`に時間を扱うメソッド群を定義しています。 + +{% highlight ruby %} +class Fixnum + def hours + self * 3600 # 1時間あたりの秒数を返します + end + alias hour hours +end + +# 1月1日の0時0分から14時間後 +Time.mktime(2006, 01, 01) + 14.hours # => Sun Jan 01 14:00:00 +{% endhighlight %} + +### 不思議なメソッド名 + +Rubyでは、メソッド名の最後に疑問符(?)や感嘆符(!)が使われることがあります。 +慣習的に、問い合わせ系のメソッドの最後には疑問符が使われます +(例: レシーバが空の場合に`true`を返す`Array#empty?`)。 +また、使用に危険を伴うメソッドの最後には感嘆符が使われます +(例: `self`あるいは引数の内容を書き換えるようなメソッド。`exit!`など)。 +けれど、危険なメソッドすべてがこの慣習に従っているわけでも +ないことに注意してください。 +`Array#replace`は、与えられた配列の内容で配列の内容を置き換えます。 +この操作は、自身を**変更しない**ようなメソッド名とは意に反する振る舞いをします。 + +### 特異メソッド + +特異メソッドはオブジェクト単位のメソッドです。 +特異メソッドは、定義したオブジェクトからだけ利用できるメソッドになります。 + +{% highlight ruby %} +class Car + def inspect + "Cheap car" + end +end + +porsche = Car.new +porsche.inspect # => Cheap car +def porsche.inspect + "Expensive car" +end + +porsche.inspect # => Expensive car + +# 他のオブジェクトには影響しない +other_car = Car.new +other_car.inspect # => Cheap car +{% endhighlight %} + +### 「存在しなかった」メソッド + +Rubyはメッセージに対応するメソッドを見つけられなかったとしても諦めません。 +その場合は、見つけられなかったメソッド名と引数と共に、 +`method_missing`メソッドを呼び出します。 +`method_missing`メソッドはデフォルトではNameError例外を投げますが、 +アプリケーションに合うように再定義することもできます。 +実際、多くのライブラリがそのようにしています。 +以下がその例です。 + +{% highlight ruby %} +# idは呼び出されたメソッド名です。 +# *構文は「arguments」という名前の配列に +# 呼び出されたメソッドに渡されたすべての引数を格納します。 +def method_missing(id, *arguments) + puts "Method #{id} was called, but not found. It has " + + "these arguments: #{arguments.join(", ")}" +end + +__ :a, :b, 10 +# => Method __ was called, but not found. It has these +# arguments: a, b, 10 +{% endhighlight %} + +このコードは単に呼び出されたメソッドの詳細を出力しているだけですが、 +ここには何を書いても良いので、メッセージを受け取って適切な処理を行えます。 + +### 関数呼び出しではなくメッセージ送信 + +メソッド呼び出しは実際には他のオブジェクトへの**メッセージ送信**です。 + +{% highlight ruby %} +# これは +1 + 2 +# これと同じで... +1.+(2) +# つまりこういうことです。 +1.send "+", 2 +{% endhighlight %} + +### ブロックは作りかけのオブジェクト + +ブロック(実際にはクロージャ)は標準ライブラリでもすごく使われています。 +ブロックを呼び出すには、`yield`を使うか、引数リストに特別な引数を追加して +それを`Proc`オブジェクトにします。以下がその例です。 + +{% highlight ruby %} +def block(&the_block) + # この内側では、the_blockはメソッドに渡されたブロックになります。 + the_block # ブロックが返ります +end +adder = block { |a, b| a + b } +# adderはここでProcオブジェクトになります +adder.class # => Proc +{% endhighlight %} + +`Proc.new`にブロックを渡すか、`lambda`メソッドを呼び出すことで、 +メソッド呼び出しの外側でブロックを作成することもできます。 + +同様に、メソッドもまた作りかけのオブジェクトです。 + +{% highlight ruby %} +method(:puts).call "putsはオブジェクト!" +# => putsはオブジェクト! +{% endhighlight %} + +### 演算子は糖衣構文(シンタックスシュガー) + +Rubyにおけるほとんどの演算子は糖衣構文です。 +いくつかの優先順位規則にもとづいて、メソッド呼び出しを単に書き換えているだけです。 +たとえば、Fixnumクラスの`+`メソッドを次のようにオーバーライドすることもできます。 + +{% highlight ruby %} +class Fixnum + # できるけれど、しないほうがいいでしょう + def +(other) + self - other + end +end +{% endhighlight %} + +C++の`operator+`などは必要ありません。 + +`[]`や`[]=`といったメソッドを定義すれば、配列のようなスタイルでアクセスすることもできます。 +(+1や-2みたいな)単項の+や-を定義するには、`+@`か`-@`といったメソッドを定義する必要があります。 +けれど、以下の演算子は糖衣構文では**ありません**。 +これらはメソッドではないので、再定義できません。 + +{% highlight ruby %} +=, .., ..., !, not, &&, and, ||, or, !=, !~, :: +{% endhighlight %} + +加えて`+=`、`*=`などは`var = var + other_var`、`var = var * other_var` +などの処理の略記法になり、これらも再定義できません。 + +## もっと知りたい + +Rubyについてもっと知りたくなったのなら、 +[ドキュメント](/ja/documentation/)の +その他のコンテンツを見てみてください。 + + +[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html diff --git a/ja/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md b/ja/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md new file mode 100644 index 0000000000..d2d9b93a51 --- /dev/null +++ b/ja/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md @@ -0,0 +1,121 @@ +--- +layout: page +title: "C・C++からRubyへ" +lang: ja +--- + +C・C++とRubyとで、あなたのコードがどう変わるのかを示すのは容易ではありません。 +ものすごく大きな違いがあるからです。 +一つには、Rubyの実行環境が本当にたくさんのことを行うという違いがあります。 +RubyはC言語の「機構側は何も隠蔽しない」という原則からはかけ離れた言語のように見えます。 +Rubyの本質は、人間の仕事を簡単にするために、できるだけ多くの作業を実行環境が肩代わりすることにあります。 +最適化するためにコードをプロファイリングするようになるまでは、Rubyを使う際にコンパイラ側の都合を気にする必要はありません。 + +とはいうものの、C・C++で書かれたコードの実行時間と比べて、Rubyコードの実行時間はずっと遅いと言われています。 +そのため、どうしたら最小のコードでやりたいことを実現できるかを考えると同時に、 +それを高速化する方法についても、あなたは頭をフル回転させることになるかもしれません。 +RubyはC++よりもずっとずっとシンプルな言語です。Rubyはきっとあなたのことを甘やかすことでしょう。 + +Rubyは動的型付けです。静的型付けではありません。 +Rubyの実行環境は、なるべく多くのことをプログラム実行時に行おうとします。 +たとえば、どのモジュールをRubyプログラムにリンクする(ロードして使えるようにする)かや、どのメソッドを呼び出すかを、 +あなたはあらかじめ知る必要はありません。 + +幸いなことに、RubyとCは堅実に共生関係を持つことができます。 +Rubyはいわゆる「拡張ライブラリ」という仕組みをサポートしています。 +拡張ライブラリは、Rubyプログラムから使用することができるものですが、Cで書かれます +(外側から見ると、それはRubyで書かれたライブラリと同様に振る舞います)。 +この仕組みを使うと、Rubyプログラムの中でパフォーマンスが重要となる部分を、純粋なCで書き直すことができます。 + +そしてもちろん、Ruby自体もCで書かれています。 + +### Cとの類似 + +Cと同様に、Rubyは... + +* 書きたいと思えば、手続き的にプログラムを書くことができます(けれど、その裏側はオブジェクト指向のままです)。 +* 使用できる演算子は、複合代入子やビット演算子も含めて、だいたい同じです。ですが、Rubyには`++`と`--`はありません。 +* `__FILE__`と`__LINE__`を使えます。 +* 定数もあります。けれど、`const`のような特別なキーワードはありません。 + 定数化は名前付けによって行われます。変数名の最初が大文字のものは定数として扱われます。 +* 文字列は二重引用符(`"`)で括ります。 +* 文字列は可変です。 +* manページのように、ターミナルからほとんどのマニュアルを読むことができます。ただ、その際に使うコマンドは`ri`です。 +* これまでと同じコマンドラインデバッガを使うことができます。 + +### C++との類似 + +C++と同様に、Rubyは... + +* 使用できる演算子はだいたい同じです(`::`もあります)。`<<`はリストに要素を追加するためによく使われます。 + Rubyではメンバ関数の呼び出しに`->`は使いません。常に`.`を使うので、この点には気をつけてください。 +* `public`や`private`、`protected`などを使います。 +* 継承を一文字で表現できます。ですが、使うのは`:`ではなく`<`になります。 +* コードをモジュール化することになりますが、これはC++で`namespace`を使うことと変わりません。 +* 例外を扱うための作法は一緒です。ですが、そのために使われるキーワード名などには違いがあります。 + +### Cとの違い + +Cと違って、Rubyは... + +* コードをコンパイルする必要はありません。単に実行するだけです。 +* オブジェクトは強く型付けされています(そして、変数名自身はまったく型を持ちません)。 +* マクロやプリプロセッサはありません。キャストもポインタ(とポインタ演算)もありません。 + typedef や sizeof、列挙型もありません。 +* ヘッダファイルはありません。ただ関数(「メソッド」と呼ばれます)とクラスをソース内に記述するだけです。 +* `#define`はありません。そのかわりに定数を使います。 +* すべての変数はヒープ上に配置されます。あなたがそれを解放する必要はありません。代わりにGCがその世話をしてくれます。 +* メソッド(関数)の引数は参照渡しされます。値渡しはされません。 +* `#include `や`#include "foo"`の代わりに、`require 'foo'`と書きます。 +* アセンブリコードに変換はできません。 +* 行の終わりにセミコロンは不要です。 +* `if`や`while`などの条件式は、括弧を付けなくても動きます。 +* メソッド(関数)呼び出しの括弧は基本的にオプションです。 +* 波括弧はあまり使いません。複数行に渡る処理片の終わりには、一般的に`end`キーワードが使われます。 +* `do`キーワードは「ブロック」と呼ばれる機能のためにあります。Cにおける「do命令」ではありません。 +* 「ブロック」はC言語にあるブロックとは別ものです。 + Rubyのブロックは、メソッド呼び出しに関連付けるコード片を意味します。 + ブロックは、メソッドの本体から実行時に呼び出されます。 +* 変数宣言はありません。変数が必要になったら、新しい変数名に紐付けるだけです。 +* 真偽値をテストする際、`false`と`nil`だけが偽と評価されます。他(`0`、`0.0`、`"0"`なども)はすべて真となります。 +* `char`はありません。単なる一文字だけの文字列になります。 +* 文字列の終端はヌル文字ではありません。 +* 配列リテラルは角括弧です。波括弧ではありません。 +* 要素を追加すると、配列の大きさは自動的に拡張されます。 +* 二つの配列を足し合わせると、新しい大きい配列が返されます(もちろん、ヒープ上に割り当てられます)。ポインタ演算は行われません。 +* だいたいの場合は、すべてが式です(`while`命令が実際に右辺値を評価しているなど) + +### C++との違い + +C++と違って、Rubyは... + +* 明示的に参照を扱うことはありません。 + Rubyでは、すべての変数はあるオブジェクトへの間接参照として扱われます。 +* オブジェクトは強い型付けがされますが、それは*動的*に行われます。 + 環境は*実行時*、メソッド呼び出しが実際に行われたタイミングで型を決定します。 +* コンストラクタは、クラス名ではなく、`initialize`メソッドとなります。 +* メソッドはすべて仮想関数です。 +* クラス変数(静的メンバ変数)名は、常に`@@`からはじまります(例えば`@@total_widgets`というように)。 +* 外部からメンバ変数に直接アクセスすることはありません。 + publicなメンバ変数(Rubyでは属性と呼ばれます)へのアクセスはメソッド経由で行います。 +* `this`の代わりに`self`を使います。 +* 最後が?や!で終わるメソッドがあります。これらは実際にメソッド名の一部です。 +* 多重継承はありません。Rubyでは代わりにMix-inを使います。 + Mix-inを用いることで、モジュールが持つすべてのインスタンスメソッドを「継承」できます。 +* 大文字表記、小文字表記が強制されるケースがあります。たとえば、 + クラス名は大文字から開始し、変数名は小文字から開始する必要があります。 +* メソッド呼び出しの括弧は基本的にオプションです。 +* いつでもクラスをオープンしてメソッドを追加できます。 +* どんな種類のオブジェクトでも変数に設定でき、型は実行時に評価されるので、 + C++テンプレートは必要ありません。キャストもありません。 +* イテレーションはわずかな違いがあります。 + Rubyでは、(`vector::const_iterator iter`のような)独立したイテレータ・オブジェクトは使いません。 + 代わりに、オブジェクトは`Enumerator`モジュールをMix-inし、 + `my_obj.each`のように呼び出すメソッドを作成する必要があります。 +* コンテナクラスは`Array`と`Hash`の2種類だけです。 +* 型変換はありません。Rubyを使い始めれば、必要ない理由がわかるはずです。 +* マルチスレッド機能は組み込まれています。 + ただし、Ruby1.8 以前のマルチスレッド機構は、ネイティブスレッドに対してグリーンスレッドと呼ばれ、 + 処理系だけで実装されたスレッド機能になっています。 +* ユニットテストのライブラリはRubyに標準添付されています。 + diff --git a/ja/documentation/ruby-from-other-languages/to-ruby-from-java/index.md b/ja/documentation/ruby-from-other-languages/to-ruby-from-java/index.md new file mode 100644 index 0000000000..38503724a5 --- /dev/null +++ b/ja/documentation/ruby-from-other-languages/to-ruby-from-java/index.md @@ -0,0 +1,52 @@ +--- +layout: page +title: "JavaからRubyへ" +lang: ja +--- + +Javaは成熟しており、よくテストされています。 +アンチJavaな人々が訴えるのに反して、Javaは高速です。ですが、とても冗長です。 +JavaからRubyへ移行すると、コードの量を大幅に削減できます。 +プロトタイピングを少ない時間で済ませられるようになるでしょう。 + +### Javaとの類似 + +Javaと同様に、Rubyは... + +* メモリはGCによって管理されます。 +* オブジェクトは強い型付けがされます。 +* メソッドにはpublic、private、protectedを指定できます。 +* 埋め込み型のドキュメントツールがあります(Ruby用のツールはRDocと呼ばれます)。 + rdocで生成されたドキュメントはjavadocで生成したドキュメントにとてもよく似ています。 + +### Javaとの違い + +Javaと違って、Rubyは... + +* コードをコンパイルする必要はありません。単に実行するだけです。 +* 異なったサードパーティ製のGUIツールキットがいくつか存在します。 + Rubyのユーザーは、たとえば[WxRuby][1]、[FXRuby][2]、[Ruby-GNOME2][3]、[Qt][4]、 + あるいはRubyに同梱されているRuby Tkなどを利用します。 +* クラスなどの定義の最後には`end`キーワードを使います。コードのまとまりを波括弧で括ることはしません。 +* `import`の代わりに`require`を使います。 +* すべてのメンバ変数はプライベード変数です。オブジェクトの外側からはメソッドを介してそれらにアクセスします。 +* メソッド呼び出しの括弧は基本的にオプションで、しばしば省略されます。 +* 2や3.14159といった数値も含めて、すべてのものはオブジェクトです。 +* 静的型チェックはありません。 +* 変数名はただのラベルです。変数名は関連付けられた型を持ちません。 +* 型宣言はありません。必要に応じて新しい変数名を割りあてれば、それらを利用できます + (`int[] a = {1,2,3};`ではなく`a = [1,2,3]`というように)。 +* キャストはありません。メソッドを呼び出すだけです。 + 例外を確認するつもりなら、コードを実行する前にユニットテストで示しましょう。 +* `Foo foo = new Foo("hi")`は`foo = Foo.new("hi")`と書きます。 +* コンストラクタは常に”initialize”という名前になります。クラス名ではありません。 +* インターフェイスの代わりにMix-inを使います。 +* XMLよりもYAMLが好まれます。 +* `null`は`nil`です。 +* `==`と`equals()`の扱いが異なります。等価かどうかを評価したい時(Javaで`equals()`を使うケース)は`==`を使います。 + 二つのオブジェクトが同一かどうかを確認したい時(Javaで`==`を使うケース)は`equal?()`を使います。 + +[1]: http://wxruby.rubyforge.org/wiki/wiki.pl +[2]: http://www.fxruby.org/ +[3]: http://ruby-gnome2.osdn.jp/ +[4]: https://github.com/ryanmelt/qtbindings/ diff --git a/ja/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md b/ja/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md new file mode 100644 index 0000000000..89c68cd0d1 --- /dev/null +++ b/ja/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md @@ -0,0 +1,63 @@ +--- +layout: page +title: "PerlからRubyへ" +lang: ja +--- + +Perlはすばらしい言語です。ドキュメントもすばらしいし、Perlコミュニティもすばらしいコミュニティです。 +しかし、言語はかなり大きく、間違いなく複雑です。 +もっとシンプルで直交的な言語や、最初から洗練されたオブジェクト指向の機能が組み込まれた言語を求めているPerl使いにとって、 +Rubyは答えになるかもしれません。 + +### Perlとの類似 + +Perlと同様に、Rubyは… + +* CPANのような、[RubyGems][1]という名前のパッケージ管理システムがあります。 +* 正規表現エンジンが組み込まれています。 +* たくさんの便利な組み込みライブラリがあります。 +* 括弧はしばしば省略されます。 +* 文字列は基本的に同じように使えます。 +* 一般的な区切り文字や正規表現構文はPerlと同様です。 + `%q{this}`(一重引用符)や`%Q{this}`(二重引用符)、 + `%w{this for a single-quoted list of words}`のようになります。 + 区切り文字は、望むなら`%Q|can|` `%Q(use)` `%Q^other^`のようにもできます。 +* 二重引用符の文字列中に、`"looks #{like} this"` のような形で式展開すること + ができます(`#{}`の中に任意のRubyコードを置くことができます)。 +* シェルコマンドを実行するには`` `backticks` ``のようにします。 +* rdocという組み込みのドキュメントツールがあります。 + +### Perlとの違い + +Perlと違って、Rubyは… + +* Perlのようなコンテキスト依存のルールはありません。 +* 変数はオブジェクトそのものではありません。常にオブジェクトへの参照です。 +* 変数名の最初の1文字に`$`や`@`などが使われることがあります。 + これらは型ではなく、スコープを示します + (`$`はグローバル変数、`@`はインスタンス変数、`@@`はクラス変数 + であることを示します)。 +* 配列リテラルは括弧ではなく角括弧を使います。 +* リストの中にリストを入れると、それはフラットな一つのリスト + になるわけでなありません。代わりに配列の配列が得られます。 +* `sub`の代わりに`def`を使います。 +* 行の終わりにセミコロンは必要ありません。 + 関数定義やクラス定義、case文の終わりを示すには、 + `end`キーワードを使います。 +* オブジェクトは強く型付けされています。 + 他の型に変換するには、`foo.to_i`や`foo.to_s`などの変換メソッドを + 呼び出す必要があります。 +* `eq`、`ne`、`lt`、`gt`、`ge`、`le`はありません。 +* ダイアモンド演算子(`<>`)はありません。 + `IO.some_method`を代わりに使います。 +* `=>`はハッシュリテラルにだけ使われます。 +* `undef`はありません。Rubyには`nil`があります。 + `nil`は(Rubyにおける他の値と同様に)オブジェクトで、 + 未定義の変数とは異なります。 + 真偽値のように扱った場合、`nil`は`false`と評価されます。 +* 真か偽かの判定では、`false`と`nil`のみが偽と評価されます。 + それ以外の値(`0`、`0.0`、`"0"`など)はすべて真と評価されます。 +* [PerlMonks][2]はありませんが、ruby-listメーリングリストなどの質問場所があります。 + +[1]: http://guides.rubygems.org +[2]: http://www.perlmonks.org/ diff --git a/ja/documentation/ruby-from-other-languages/to-ruby-from-php/index.md b/ja/documentation/ruby-from-other-languages/to-ruby-from-php/index.md new file mode 100644 index 0000000000..58f7507ba9 --- /dev/null +++ b/ja/documentation/ruby-from-other-languages/to-ruby-from-php/index.md @@ -0,0 +1,43 @@ +--- +layout: page +title: "PHPからRubyへ" +lang: ja +--- + +PHPはWebアプリケーションを作る道具として普及しています。 +けれど、もしあなたがRuby on Railsに興味をもったのなら、 +あるいは一般的な作業をさせるのに適した言語を求めているなら、Rubyは一見の価値があります。 + +### PHPとの類似 + +PHPと同様に、Rubyは... + +* 動的に型付けされます。変数の宣言について心配することはありません。 +* クラスがあります。PHP5のように `public`、`protected`、`private`によるアクセス制御が可能です。 +* いくつかの変数は`$`から始まります(すべてではありませんが)。 +* `eval`もあります。 +* 式展開を使えます。`"$foo is a $bar"`とする代わりに`"#{foo} is a #{bar}"`と書きます。 + シングルクォーテーションで括った時には、これは有効になりません。 +* ヒアドキュメントがあります。 +* PHP5と同様に、例外機構があります。 +* かなり膨大な標準ライブラリがあります。 +* `array()`を`{`と`}`に変えれば、配列とハッシュは期待するように動きます。 + `array('a' => 'b')`は`{'a' => 'b'}`とします。 +* `true`と`false`はPHPと同じように振る舞います。ただし、`null`は`nil`になります。 + +### PHPとの違い + +PHPと違って、Rubyは... + +* 強い型付けがあります。文字列や数値などを互いに変換するためには、言語に任せるのではなく + `to_s`、`to_i`などのメソッドを明示的に呼ぶ必要があります。 +* 文字列、数、配列、ハッシュなどはオブジェクトです。`abs(-1)`を呼び出す代わりに`-1.abs`とします。 +* パラメータを渡していることを明確にする場合を除いて、メソッド呼び出しの括弧は基本的にオプションです。 +* 標準ライブラリや拡張は、モジュールやクラスを使って構造化されています。アンダースコアなどによる名前付けを使った構造化は行いません。 +* リフレクション機能はオブジェクトごとに備わっています。PHP5のように`Reflection`クラスを使う必要はありません。 +* 変数は参照です。 +* 抽象クラス(`abstract`)や`interface`はありません。 +* ハッシュと配列には互換性はありません。 +* `false`と`nil`のみが偽になります。`0`や`array()`、`””`はすべて真と評価されます。 +* ほとんどすべてのことは、メソッド呼び出しです。`raise`(PHPにおける`throw`)ですら、メソッド呼び出しです。 + diff --git a/ja/documentation/ruby-from-other-languages/to-ruby-from-python/index.md b/ja/documentation/ruby-from-other-languages/to-ruby-from-python/index.md new file mode 100644 index 0000000000..f8815af5fd --- /dev/null +++ b/ja/documentation/ruby-from-other-languages/to-ruby-from-python/index.md @@ -0,0 +1,77 @@ +--- +layout: page +title: "PythonからRubyへ" +lang: ja +--- + +Pythonは、Rubyと同様、とてもよくできた汎用的なプログラミング言語です。 +PythonからRubyへやってきたなら、Pythonよりもほんの少しだけ構文が多いことに気づくでしょう。 + +### Pythonとの類似 + +Pythonと同様に、Rubyは... + +* `irb`と呼ばれる対話型の実行環境があります。 +* コマンドライン上でドキュメントを読めます + (`pydoc`の代わりに`ri`コマンドを使います)。 +* 通常の改行を除いて、特殊な行区切りはありません。 +* Pythonにおける三重引用符のように、文字列リテラルを複数行に記述できます。 +* 角かっこはリストを示すために使われ、 + 波かっこは辞書(Rubyではハッシュと呼ばれます)を表すために使われます。 +* 配列は同じように機能します( + 要素を追加すれば配列は大きくなっていきます。 + `a3 = [ a1, a2 ]`のように書けば配列の配列を作って、 + それらを構造化することもできます)。 +* オブジェクトは強力で動的な型付けを持ちます。 +* すべてはオブジェクトです。そして、変数はオブジェクトへのただの参照です。 + キーワードは若干の違いがありますが、だいたい同じように機能します。 +* rdocという埋め込み型のドキュメントツールがあります。 +* 第一級関数、無名関数、クロージャといった関数型プログラミングを行うための + 道具立てもそろっています。 + +### Pythonとの違い + +Pythonと違って、Rubyは... + +* 文字列は可変です。 +* 定数(値が変更されることを期待しない変数)をつくれます。 +* 名前付けについての規約がいくつかあります。 + たとえば、クラス名は大文字から始め、変数名は小文字で始めます。 +* リストコンテナは、配列しかありません。配列は可変です。 +* 二重引用符で囲まれた文字列は、エスケープシーケンス(`\t`など)や、 + 式展開(いちいち`+`で文字列連結すること無しに、 + Rubyの式を評価した結果を他の文字列に挿入可能にするしくみ)を解釈します。 + 一重引用符で囲まれた文字列は、Pythonでいうraw文字列と同じ扱いとなります。 +* クラスに新しいスタイル・古いスタイルといったものはありません + (Python3からはこの問題はなくなりました。けれど、Python2との完全な後方互換性はありません)。 +* 属性には直接アクセスできません。 + Rubyでは、属性へのアクセスはすべてメソッド経由になります。 +* メソッド呼び出しの括弧は基本的にオプションです。 +* Pythonでアンダースコアの数によって実現しているアクセス制御は、 + `public`、`private`、`protected`を使って行います。 +* 多重継承の代わりにMix-inを使います。 +* 組み込みクラスにメソッドを追加したり、書き換えたりできます。 + どちらの言語でも任意の時点でクラスを開いたり編集できますが、 + Pythonでは組み込みクラスに対してはそれは許可されていないのに対し、 + Rubyではその制限はありません。 +* `True`と`False`は、`true`と`false`になります。 + また、`None`の代わりは`nil`になります。 +* 真か偽かの判定では、`false`と`nil`のみが偽と評価されます。 + それ以外の値(`0`、`0.0`、`""`、`[]`など)はすべて真と評価されます。 +* `elif`の代わりに`elsif`を使います。 +* `import`の代わりに`require`を使います。それ以外の使い方は同じです。 +* (docstring の代わりに)クラスやメソッドの*直前*に書かれた複数行のコメントは、 + ドキュメント生成に使われます。 +* たくさんの省略記法があります。けれど、すぐに手になじむはずです。 + それらはRubyをより楽しく生産的に使えるようにするために用意されています。 +* 一度定義した変数を、(Pythonでいう`del`のように)未定義にする方法はありません。 + 変数を`nil`で設定すれば、変数に入っていた値をGCできるようにはできますが、 + スコープが存在する限り変数自体はシンボルテーブルに残り続けます。 +* `yield`キーワードの振る舞いは異なります。 + Pythonでは、関数呼び出しの外側のスコープへ実行結果を返します。 + そのため、外側のコードは処理の再開について責任を負います。 + Rubyでは、`yield`は最後の引数として渡された別の関数が実行されます。 + そして、実行が完了すると処理を再開します。 +* Pythonがサポートしている無名関数はラムダ式のみですが、 + Rubyはブロック、Procオブジェクト、ラムダ式といった種類の無名関数があります。 +