3

私は Ruby を学んでいる初心者なのですか、それとも Java/C# よりも (同じ) ものを書く方法が本当にたくさんあるのでしょうか? また、Java よりも柔軟性がある場合、混乱を避けるために一般的に使用されていないRuby の言語機能はありますか?

例としては、並列代入や文字列のさまざまな書き方などでしょうか?

注: Java/C# との比較を求めているわけではありません...この言語の質問だけをお願いします...

編集: C#、Java、Ruby は強く型付けされており、Ruby (Python など) のみが動的に型付けされていることを理解しています (Java/C# は静的に型付けされています)。いくつかの回答は、動的型付け言語の方がより柔軟であると言っています。これは必ずしも真実ですか? また、構文にどのように影響しますか? 構文の柔軟性についてのみ質問しています。

(PHP も動的に型付けされており、私が見た限りでは、Java/C# よりも柔軟ではないようです。繰り返しますが、展開やその他の側面ではなく、構文の観点から意味します...)

4

6 に答える 6

8

私にとって、Ruby で最もよく使われ、Java に欠けている機能は、コード ブロック/ラムダ/クロージャです。

もう 1 つの優れた (しかし危険な) 機能は、オープン クラスです。必要なクラスを変更できます。新しいメソッドを追加したり、古いものを変更したりできます。クラス全体ではなく、特定のオブジェクトにメソッドを追加することもできます :)。

于 2009-01-01T09:46:59.940 に答える
4

Ruby によく似たもう 1 つの動的言語は Python です。しかし、Zen of Pythonでは、ルールの 1 つで、「何かを行うには 1 つだけの方法が必要です」と規定されています。これは、非常に多くのメタプログラミングを可能にする Ruby とは正反対であり、同じことを行う方法は本質的に無数にあります。

とはいえ、Python 3.0 (別名: 3000) までは文字列と Unicode の値が異なる型だったのは皮肉なことです。理にかなっていますが、テキスト操作を実行するために 2 つの間で頻繁に変換を行うと、問題が発生することがあります。

選択肢があれば、動的言語の入門として Python を使用することをお勧めします。Ruby には何の問題もありませんが、何かを行うための「正しい」方法が完全に明白ではない状況に遭遇することは少なくなるでしょう。

PHP が動的に型付けされたことに応じて:

PHP の型システムは柔軟で、使用されているコンテキストに基づいて型を自動的に変換できます。しかし、これは実際には実際の動的型にはなりません。言語自体はほとんど静的であり、たとえば、実行時にオブジェクトに属性を追加することはできません (少なくとも、最後にチェックしたとき)。

Python、そしておそらく Ruby は、実際には厳密に型付けされています。つまり、自信を持って型比較を行うことができ、数値文字列を追加して数値を取得するような PHP トリックを行うことはできません。真の動的言語では、多くの場合、実行時にインスタンスまたはクラスの型を調整したり、いずれかに属性を追加したりできるメタクラス化も可能です。

于 2009-01-01T08:25:12.523 に答える
1

Ruby は動的言語です。C# と Java はどちらも強力な型付けを備えた静的型付け言語です。v4.0 の C# は動的機能を追加しますが、これまで Java と C# は、Ruby や Python などの動的言語とはまったく異なる、より厳密なパラダイムを持っていました。

于 2009-01-01T07:38:51.713 に答える
1

ラムダに関する上記のrkjの回答にコメントしました。このコードは、あなたが求めた例を示しています。

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

最初に注意すべき点は、このfixed_pointメソッドは、特定のテストに合格するまで、一部のデータにプロセスを段階的に適用するという一般的な考え方を処理することです。このsqrt関数は、平方根を見つけるプロセスと、いつ満足するかを判断するためのテストを定義します。これらの「手順」は、他の形式のデータと同じように渡されるため、fixed_point魔法のように機能します。

プロセスを一時的に保存してテストする代わりに、すべてを匿名にすることができます。次のように書き直すことができsqrtます。

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

この機能がなければ、プロセスとテストの両方を個別の関数として定義し、sqrt_fixed_pointそれらを呼び出す特別な関数を作成する必要があります。私が知る限り、Java は Functors を使用して同様のことを行うことができますが、コメントするのに十分な知識がありません。私がブログなどで見たコンセンサスは、Java はこれを非常に複雑にするため、試しただけで鼻血が出てしまうというものです。

もちろん、Ruby が提供するもう 1 つのオプションは、メタプログラミングです。sqrt正しいプロセスとテストを使用して(オンザフライで)書き換えられるように書き換えることができfixed_pointますが、これはおそらく機能の悪用です:-)

ps。JoelOnSoftware のリンクが掲載されていることは、繰り返し説明する価値があります。http://www.joelonsoftware.com/items/2006/08/01.html

于 2009-10-16T18:43:59.063 に答える
0

すべての動的型付け言語 (Ruby など) は通常、静的型付け言語 (Java など) よりも柔軟です。型システムと戦う必要はありません。これは、静的に型付けされた言語でよくあることです。

于 2009-01-01T08:07:03.420 に答える
-3

私は Java や C# については知りませんが、数値に対する + の動作を再定義できるという事実は、それ自体が物語っています。

于 2009-01-01T11:07:18.813 に答える