基于用户在scala中提到的条件的行为?

时间:2014-04-15 20:30:28

标签: scala

我有一个对象Foo

object Foo extends RegexParsers{
  def apply(s:String): Array[String] = parseAll(record, line) match {
       // some logic 
      }
   def record = repsep(mainToken, ",")
   // some more code
   def unquotes = "[^,]+".r 
}

现在,对于逗号分隔的字符串,这是非常硬编码的。

我想基本上修改这个功能,基本上考虑到另一种情况(标签分隔)..

以下代码适用于

object Foo extends RegexParsers{
      def apply(s:String): Array[String] = parseAll(record, line) match {
           // some logic 
          }
       def record = repsep(mainToken, "\t") // change here
       // some more code
       def unquotes = "[^\t]+".r  // change here
    }

只有两处变化......

如何合并这两个更改..我可以将此分隔符作为参数...(默认参数逗号)...然后基于此...执行所需的代码.. ?? 感谢

2 个答案:

答案 0 :(得分:2)

您可以使Foo成为一个类而不是一个对象,并将所需的分隔符作为构造函数参数传递。

class Foo(separator: Char) extends RegexParsers {

  def apply(s:String): Array[String] = parseAll(record, line) match {
    // some logic 
  }

  def record = repsep(mainToken, separator.toString)

  def unquotes = ("[^" + separator + "]+").r
}

然后通过制作适当的实例来使用它:

// Parser that uses comma as the separator
val foo1 = new Foo(',')

// Parser that uses tab as the separator
val foo2 = new Foo('\t')

答案 1 :(得分:1)

只需添加var。

即可获得解决方案

这也有效:

object Foo extends RegexParsers{
  // make sep a var
  var sep : String = ","
  def apply(s:String): Array[String] = parseAll(record, line) match {
     // some logic 
  }
  def record = repsep(mainToken, sep)
  // some more code
  def unquotes = ("[^" + sep + "]+").r 
}

要更改分隔符,请执行以下操作:

Foo.sep = "\t"

但是请注意,没有添加可变状态,当代码异步或并行运行时,您可能遇到问题。