0

私はこのコードを持っています:

 #!/usr/bin/env ruby
 #encoding: utf-8
 require "csv"

  class FileTypeEnum

  channel=0
  national=1
  regional=2
  end


  class CsvParser

 attr_accessor :row_hash, :file_path, :mode

    def initialize(filePath, file_type_enum) #Client should only pass the legal values of file_type_enum
 @file_path = filePath
 @mode = file_type_enum #mode should be one of the 3 legal integer values corresponding to the enum

 puts "CSV Parser received = #{filePath}"
 csv = CSV.read("#{filePath}")

     case @mode
 when 0
    parse_channel
 when 1
    parse_national
 when 2
    parse_regional
 else
    puts "Error in method invocation"
 end

    end#initialize

これは、ネイティブの列挙型クラスがないため、Rubyで列挙型を機能させるためにグーグルで見つけた方法です。

これが私が達成しようとしていることです

 1) any code that instantiates CsvParser must only be able to pass the legal values for the parameter "file_type_enum"

 2) Can someone give an example of code of How I can retrieve the integer value inside initialize from the enum parameter and set mode.

ありがとう、

4

1 に答える 1

0

まず、列挙型は目的に対して有効ではありません。変数ではなく、定数でなければなりません。これを試して:

class FileTypeEnum
  CHANNEL=0
  NATIONAL=1
  REGIONAL=2
end

これを行う唯一の方法は、値が正しい範囲内にあるかどうかを確認することです。このようなもの:

unless([0,1,2].includes? file_path_enum)
  raise ArgumentError.new("The file_path_enum argument must be one of the values defined by FileTypeEnum.")
end

ただし、列挙型をまったく使用することは、あまり Ruby らしくありません。シンボルは、Ruby でははるかに優れた代替手段であり、enum 定数の値自体が重要でない場合ははるかに明確です。

于 2013-09-30T14:01:59.443 に答える