代码之家  ›  专栏  ›  技术社区  ›  wheaties

Scala中的自定义控件结构?

  •  3
  • wheaties  · 技术社区  · 14 年前

     if( Predicate ){
         Action
    
         return Value
     }
    

    也就是说,“returnif”类型的语句。我试过用签名做函数,比如 foo[A,B]( pred:((A,A)=>Boolean), value:Option[B] ) return 声明。

    在函数式语言或更具体的Scala中,有没有一种继承方法来生成这样的控制结构?

    foo 不起作用的是它不能短路包含函数的求值。就是这样

    def intersect( geometry:Geometry, reference:Geometry ):Geometry = {
        return_if( withinBounds( geometry, projection ), logToString( logger, "Geometry outside " + projection.toString ), EmptyGeometry() )
        return_if( topologicallyCorrect( geometry ), intersect( correct( geometry ), reference )
        //rest of the function
    }
    

    并且仍然允许在 return_if

    4 回复  |  直到 14 年前
        1
  •  2
  •   Plankalkül    14 年前

    嗯,据我所知,您希望控件结构中的返回退出它所嵌入的函数。

    我不确定这是否可能。因为return\u if中的return总是会退出return\u if,我认为没有办法告诉scala,return应该退出函数return\u if。

    我希望我明白你想做什么:)

        2
  •  7
  •   missingfaktor Kevin Wright    14 年前

    def whatevs[A, B](options : PartialFunction[(A,A), B]) : Option[B] = {
      val myInput = generateInput
      if(options.isDefined(myInput)) {
        Some(options(myInput))
      } else None
    }
    

    那么您的用法可能如下所示:

    whateves {
       case (x,y) if x > y =>   "Biggerz"
       case (x,y) if y > x =>   "Tiny!"
    }
    

    一般来说,您不需要return语句。If表达式将计算为每个块中使用的最后一个表达式。您可能需要帮助编译器找出if表达式的类型结果,但不需要返回。

    如果whatevs函数不是您所说的那样,我建议使用原始模式匹配。

        3
  •  2
  •   Rex Kerr    14 年前

    看来你是在用这个当借口 来自代码的控制流。

    当然,你总是可以嵌套if语句,但那会很尴尬。

    不过,在Scala中还需要考虑其他一些事情。一个可以

    methodReturningOption.getOrElse(
      // All the code for the None case goes in here
    )
    

    这通常在合并不同的分支时效果很好,以防出现合理的默认情况(或者如果没有,您最终会抛出异常)。

    None match {  // Could use a real variable instead of None if it helped
      case _ if (Predicate1) => Action1; Value1
      case _ if (Predicate2) => Action2; Value2
      . . .
      case _ => ErrorHandlingPerhaps
    }
    

    但是你也可以用另一种方式来思考你的问题,这样这些谓词就没那么有用了。(如果不知道更多细节,我就不能提出建议。)

        4
  •  1
  •   Magnus    14 年前

    我不明白你为什么要这个。下面是您要编写的代码:

    def intersect( geometry:Geometry, reference:Geometry ):Geometry = {
    
      return_if( withinBounds( geometry, projection ), 
        logToString( logger, "Geometry outside " + projection.toString ), 
        EmptyGeometry() )
    
      return_if( topologicallyCorrect( geometry ), 
        intersect( correct( geometry )), 
        reference )
    
        // rest of the function
    }
    

    def intersect( geometry:Geometry, reference:Geometry ):Geometry = {
    
      if (withinBounds( geometry, projection )) {
        logToString( logger, "Geometry outside " + projection.toString )
        return EmptyGeometry() }
    
      if( topologicallyCorrect( geometry )) {
        intersect( correct( geometry ))
        return reference }
    
      //rest of the function
    }
    

    对我来说,“普通”的版本看起来更清晰。一方面,它非常清楚地表明什么是返回。更不用说了。我怀疑你有一个更复杂的用例。如果你告诉我们,也许我们可以指导你找到更合适的模式。

    推荐文章