【问题标题】:Ruby "Enum" ComparisonRuby“枚举”比较
【发布时间】:2012-05-04 02:38:04
【问题描述】:

当然枚举在 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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    你分配而不是比较

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

    【讨论】:

    • 该死,我认为用于比较的 Ruby 语法是单个 =。愚蠢的错误。干杯!
    • 如果你使用“ruby -w”,你会收到在条件表达式中使用赋值的警告。我想总比没有好?
    • 你是对的,但我自己不是 -w,因为我的结果和真正的错误往往会被它们混淆,通常是关于你不推荐的 gem 中的东西的评论' t控制
    【解决方案2】:

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

    if post_type = PostType::Page
    

    应该是

    if post_type == PostType::Page
    

    所以你的代码应该是这样的

    if post_type == :page
    ...
    

    【讨论】:

    • 因为它是红宝石方式。如果您使用 ruby​​ 编码,请使用 ruby​​ 思维方式,而不是使用幻数的思维方式。
    • 好吧,虽然它是对的,但我认为它与原始问题无关。但最终我 +1 基于您的论点归结为“您无法在 ruby​​ 中实现从 Java 中的枚举(例如)中获得的类型安全。
    • java 中的类型安全,ruby 8 中的所有其他好东西>),我提醒我在 java 中编程的时间浪费了我一半的时间,因为我必须转换 vars 和这样或那样类型的方法
    • 是的,这无关。但我认为,如果人们要朝自己的脚开枪,暗示他们有一种轻微的文化。不,这与类型安全无关。这是关于拥抱 ruby​​ 社区的风格。如果你看到有人在 Java 中使用字符串作为枚举,你可能会告诉他们他们也做错了。
    • +1 它不是无关的。塔斯回答了这个问题,提出了一个更好的方法。我真的很震惊;这是唯一提到Symbols的答案,它专门旨在解决命名问题。
    【解决方案3】:

    您是在分配而不是比较。使用== 而不是= 应该会产生更好的结果。

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

    【讨论】:

      【解决方案4】:

      你可以使用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
      

      【讨论】:

        【解决方案5】:

        这就是为什么这样做的好习惯:

        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 ..."

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-09
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-03
          • 2014-03-15
          相关资源
          最近更新 更多