Ruby“Enum”比较

时间:2012-04-23 13:18:16

标签: ruby

当然,Ruby中不存在枚举,但基于this post,我使用了以下内容:

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

5 个答案:

答案 0 :(得分:4)

指定而不是比较

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

答案 1 :(得分:4)

除了你应该使用Symbol的事实,还有一个语法错误,我假设你想要不同的语义:

if post_type = PostType::Page

应该是

if post_type == PostType::Page

所以你的代码应该是

if post_type == :page
...

答案 2 :(得分:4)

您要分配而不是比较。使用==代替=可以产生更好的结果。

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

答案 3 :(得分:3)

您可以使用case

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

此外,你真的应该使用Symbol来做到这一点:

case post_type
  when :page then # Do something
  when :post then # Do something else
  else raise 'Invalid post type'
end

答案 4 :(得分: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 ..."