2

もちろん、enum は Ruby には存在しませんが、この投稿に基づいて、次のようなものを使用しました。

class PostType
   Page = 1,
   Post = 2
end

値をメソッドに渡して比較に使用したい。そう:

initialize(post_type)
   if post_type = PostType::Page
       # do something here
   elsif post_type = PostType::Post
       # do something else here
   end
end

しかし、クラスのコンストラクターに何を渡すかに関係なく、これは機能しません。常に同じ結果が得られます。

「偽の列挙型」をメソッドに渡して比較しようとしてもうまくいかない理由についてのアイデアはありますか? 値を比較する必要がありますか? つまりpost_type = 2

4

5 に答える 5

4

比較する代わりに割り当てる

initialize(post_type) 
   if post_type == PostType::Page 
       # do something here 
   elsif post_type == PostType::Post 
       # do something else here 
   end 
end 
于 2012-04-23T13:21:50.620 に答える
4

sを使用する必要があるという事実に加えてSymbol、構文エラーがあります。別のセマンティクスが必要だと思います。

if post_type = PostType::Page

する必要があります

if post_type == PostType::Page

したがって、コードは次のようになります

if post_type == :page
...
于 2012-04-23T13:22:05.703 に答える
4

比較するのではなく、割り当てています。==の代わりに使用すると、=より良い結果が得られます。

 initialize(post_type)
    if post_type == PostType::Page
        # do something here
    elsif post_type == PostType::Post
        # do something else here
    end
end
于 2012-04-23T13:22:13.770 に答える
3

を使用できますcase

case post_type
  when PostType::Page then  # Do something
  when PostType::Post then  # Do something else
  else raise 'Invalid post type'
end

また、これには本当にSymbols を使用する必要があります。

case post_type
  when :page then # Do something
  when :post then # Do something else
  else raise 'Invalid post type'
end
于 2012-04-23T14:29:25.790 に答える
1

そのため、これを行う良い習慣は次のとおりです。

def initialize(post_type)
   if PostType::Page == post_type
       # do something here
   elsif PostType::Post == post_type
       # do something else here
   end
end

そのような間違いを犯した場合、コンパイラは警告を出します"already initialized constant ..."

于 2012-04-23T13:37:57.560 に答える