質問

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

例としては、並列割り当てや、文字列を記述するさまざまな方法などがありますか?

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

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

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

役に立ちましたか?

解決

JavaやC#については知りませんが、+が数値に対してどのように機能するかを再定義できるという事実を語ります。

他のヒント

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

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

Rubyにかなり似ているもう1つの動的言語はPythonです。ただし、 Zen of Python では、ルールの1つが&quot ;何かを行う方法は1つだけである必要があります。これはRubyとは正反対であり、メタプログラミングが非常に多いため、本質的に同じことを行う方法は無限にあります。

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

選択肢がある場合は、Pythonを動的言語の紹介として使用することをお勧めします。 Rubyには何の問題もありませんが、「正しい」という状況が少なくなる場合があります。何かをする方法は完全に明らかではありません。

PHPが動的に入力されることに応じて:

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

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

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

ラムダに関する上記の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はFunctorを使用して同様のことを行うことができますが、コメントするのに十分な知識がありません。ブログなどで私が見たコンセンサスは、Javaがこれを非常に複雑にしているので、試してみるだけで鼻血が出るということです。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top