3

Ruby では、Struct を「struct-flavored classes」、ラムダを「lambda-flavored procs」と考えるようになりました。これらの区別を表すより正確な用語はありますか?

私が何を意味するかを説明するには:

p = proc { |text| puts text }
p.inspect
                              #=> #<Proc:0x007fd9c135fd98@(irb):5>
# vs

l = lambda { puts 'foo' }
l.inspect                     #=> "#<Proc:0x007fbf33ad2830@(irb):7 (lambda)>"

...そして同様に:

Point = Class.new
Point.class                #=> Class
p = Point.new
p.class                    #=> Point
p.inspect                  #=> #<Point:0x007fd9c1038ef8>

# vs

Point = Struct.new(:x, :y)
Point.class                #=> Class
p = Point.new
p.class                    #=> Point
p.inspect                  #=> "#<struct Point x=nil, y=nil>"
4

2 に答える 2

1

クラスと構造体、またはラムダとプロシージャを区別する最善の方法は、それらを異なるレベルの剛性を持つ関連するデータ構造と見なすことです。

Ruby では、クラスと構造体はどちらも、データをコードにバインドするように設計されたデータ構造です。構造体は、データを格納するための内部ハッシュに相当するものを使用して、非常に緩い方法でこれを行います。一般に、それらはクラスよりも一時的であると見なされます。これは、クラスにロジックを配置することが少ないためです。このクラスを使用すると、コード ベースの複数の場所で使用する、より具体的なデータ構造を作成できます。Ruby で構造体を作成すると、新しいクラス オブジェクトが作成されます ( rb_class_newC では を呼び出します)。

Ruby における proc とラムダの違いは、テーマ的には似ています。ラムダはより厳密な proc です (引数のチェックと異なる戻り動作を使用)。また、配列引数を展開したりnil、不足している引数の代わりに使用したりしません。

これはすべて、選択したデータ構造で提供したい構造の量になります。データへのキー/値アクセスのみが必要な場合、ハッシュはクラスができることを実行できます。Ruby で考慮すべきもう 1 つの重要な点は、コードベースをどのように編成するかです。通常、Ruby ではやりたいことが何でもできるので、プロトタイプ ベースのメソッド宣言を使用してハッシュを作成し、それをコードで繰り返し複製することができます。ただし、これにより、同僚があなたに危害を加えたくなる可能性があります。一般に、クラスは選択されたデータ構造、または重要なデータおよびロジック バインディングです。ラムダは、引数が重要な場合、またはローカル スコープからのみ返されるようにする場合に選択されます。

于 2013-03-04T19:33:15.080 に答える