8

methodを使用する場合Structと定義する場合の利点と欠点は何ですか?initialize

引数が欠落している場合にコードが少なくなり、発生しないことがすでにわかります。

構造体の使用:

class Fruit < Struct.new(:name)
end

> Fruit.new.name
 => nil
> Fruit.new('apple').name
 => "apple"

初期化の使用:

class Fruit
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

> Fruit.new.name
ArgumentError: wrong number of arguments (0 for 1)
> Fruit.new('apple').name
 => "apple"

あなたの考えは何ですか?Structプロジェクトで頻繁に使用していますか?

4

1 に答える 1

14

クラス (非構造体) には、より単純な祖先ツリーがあります。

>> Fruit.ancestors
=> [Fruit, Object, Kernel, BasicObject]

構造体バージョンと比較して:

>> Fruit.ancestors
=> [Fruit, #<Class:0x1101c9038>, Struct, Enumerable, Object, Kernel, BasicObject]

そのため、Struct クラスが配列と間違われる可能性があります (まれですが、絶対に発生する可能性があります)。

fruit = Fruit.new("yo")
# .. later
fruit.each do |k|
  puts k
end
# outputs: yo

だから...構造体を使い捨てのデータオブジェクトとして使用します。ドメインとアプリケーションで「実際の」クラスを使用しています。

于 2013-07-05T15:40:14.140 に答える