لماذا لا يمكنني إجراء سلسلة من استدعاءات أسلوب Scala infix
-
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
لا تنتمي إلى StackOverflow