Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中,在java中,像enum这样的相关符号放在哪里?_Ruby_Enums_Symbols - Fatal编程技术网

在ruby中,在java中,像enum这样的相关符号放在哪里?

在ruby中,在java中,像enum这样的相关符号放在哪里?,ruby,enums,symbols,Ruby,Enums,Symbols,正如我从问题中了解到的,您使用符号来代表ruby中的某些东西,而不是java或C#等其他语言中的枚举 当您拥有枚举时,您可以在一个地方收集相关标识符,如下所示。您可以从代码中看到有三种颜色可用,并且paint方法接受这三个值中的一个 enum Color { Red, Yellow, Purple } public void paint(Color color) {} 如何在ruby中记录相关符号的可用值?(:red,:yellow,:purple)是否必须将其放在使用它们的方法的

正如我从问题中了解到的,您使用
符号
来代表ruby中的某些东西,而不是java或C#等其他语言中的
枚举

当您拥有枚举时,您可以在一个地方收集相关标识符,如下所示。您可以从代码中看到有三种颜色可用,并且
paint
方法接受这三个值中的一个

enum Color {
  Red,
  Yellow,
  Purple
}
public void paint(Color color) {}
如何在ruby中记录相关符号的可用值?(
:red
:yellow
:purple
)是否必须将其放在使用它们的方法的注释中,如下所示

# allowed colors: :red, :yellow, :purple
def paint(color)
end

通常我创建一个包含允许符号的常量数组。如果你想确保它不会改变,你可以把它冻结

COLORS = [:red, :green, :blue].freeze
如果有许多不同的元素,可以使用
%i()
语法:

COLORS = %i(red green blue yellow purple).freeze
如果您使用的是Rails,那么从4.1版本开始,就有一个可用于ActiveRecord::Base的

class Car < ActiveRecord::Base
  enum color: %i(red green blue yellow purple)
end

Car.new(color: :red)
class-Car
我个人的偏好是制作一个只包含常量值的模块。请参阅@JKillian的可能重复项,以便使用
常量
而不是
符号
?嗯,常量可以是符号、字符串、整数、类等,但并不特别重要。Ruby中的Enums问题有很多很好的答案,尽管这给了您不同的处理方法。在
Car
initialize
方法中,您是否验证
color
是否确实在
COLORS
中,或者只是出于文档目的?如果您试图传递无效元素,Rails将引发一个错误:
Car.new(color::small)
抛出一个
参数错误:“small”不是有效的颜色
错误。顺便说一句,Rails还允许您传递字符串,并将其转换为正确的值。在内部,枚举在数据库中表示为整数列。哦,很抱歉,现在我看到我忘记编写继承,要解决这个问题。如果我想检查一个变量是否为
:red
,或者我想传入
:red
的值,我实际上如何使用常量数组?
module TOKEN_TYPES 

  def self.const_missing(name)
    type = TYPES.find { |e| e == name.to_s.upcase.to_sym }
                    raise "constant not found error" if type.nil?
  return type

  end

# punctuation
TYPES = [:LEFT_PAREN, :RIGHT_PAREN, :LEFT_BRACE, :RIGHT_BRACE,
       :COMMA, :DOT, :SEMICOLON, :SLASH, :BACK_SLASH, :STAR,

# mathematical operators
:OP_PLUS, :OP_MINUS, :OP_MUL, :OP_DIV, :LT, :LE, :EQ, :NE, :GT, :GE, :OP_POW, # ne = <>

# logical operators
:TRUE, :FALSE, :NIL,

# program flow

# errors

# other
:AMPERSAND,

# literals
:NUM, :STRING, :SYM, :IDENTIFIER, :CONSTANT,

# keywords
:CLASS, :MODULE, :BEGIN, :END, :IF, :ELSE, :IF, :UNLESS, :DO, :WHILE, :FOR, :UNTIL,
:NEXT, :SKIP, :BREAK, :RETURN, :DEF, :ENFORCE, :INCLUDE, :EXTEND,

:EOF]
end
type = TOKEN_TYPES::CLASS
# => type = :CLASS