لماذا لا يمكنني إجراء سلسلة من استدعاءات أسلوب Scala infix

StackOverflow https://stackoverflow.com/questions/5904038

  •  29-10-2019
  •  | 
  •  

سؤال

أنا أعمل على DSL وواجهت مشكلة في استخدام الطرق كعوامل تشغيل infix في سلسلة.سأحاول فقط شرح ذلك ببعض التعليمات البرمجية.لدي صفة Term وفئات الحالة Literal و Variable تمديده.أريد إنشاء قائمة بمثيلات المصطلحات باستخدام بعض عوامل التشغيل.

case class Expr(val terms: List[Term]) {
 def +(v: String) = Expr(Literal(v) :: terms)
 def -->(func: List[String] => List[String]) = terms match {
  case Literal(v) :: ts => Expr(Variable(v, func) :: ts)
  case _ => throw new Exception("Can only apply function on literal")
 }
}

object foo {
 def bar(name: String) = Expr(Literal(name) :: Nil)
}

// some functions
val one = ... 
val all = ...

// works
foo bar "x"        
// res1: Expr = Expr(List(Literal(x)))

// works not
foo bar "x" --> all
// error: value --> is not a member of java.lang.String

// works
(foo bar "x") --> all 
// res1: Expr = Expr(List(Variable(x,<function1>)))

أتوقع أن هذا سيكون معادلاً لـ foo.bar("x").-->(all) ولكن يبدو أن المترجم يرى الأمر كذلك foo.bar("x".-->(all)).

هل كانت مفيدة؟

المحلول

باستطاعتك العثور أسبقية المشغل هنا:

أسبقية المشغل في سكالا

وفقا للإجابة الأولى - له أولوية أعلى مقارنة بالحروف.لذلك تعبير مجموعات المترجم مثل هذا:

foo bar ("x" --> all)

إذا كنت سوف تحل محل --> مع شيء ذي أولوية أقل (على سبيل المثالالحروف)، ثم ينبغي تجميعها.على سبيل المثال:

foo bar "x" to all

يمكنك أيضًا اختيار عامل التشغيل ذو الأولوية الأعلى بدلاً من ذلك bar.شيء مثل ~~> سوف تفعل ذلك، لأن ~ ذات طابع خاص ولها الأولوية القصوى:

foo ~~> "x" --> all
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top