سؤال

لقد تم تنظيم كودنا مؤخرا ونحن بصدد قليل من النقاط الساخنة المزعجة. انهم في النموذج

assert(a == b, a + " is not equal to " + b)

نظرا لأن بعض هذه الحالة يمكن أن تكون في التعليمات البرمجية تسمى كمية هائلة من المرات التي تبدأ سلسلة concat في إضافتها لأعلى. assert يعرف ب:

def assert(assumption : Boolean, message : Any) = ....

لماذا لا يعرف باسم:

def assert(assumption : Boolean, message : => Any) = ....

وبهذه الطريقة ستقيم بتكاسل. بالنظر إلى أنه لم يتم تعريفه بهذه الطريقة هناك طريقة مضمنة للاتصال تأكيد مع مرمى رسالة يتم تقييمها بتكاسل؟

شكرا

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

المحلول

يحتوي التقييم الكسول أيضا على بعض النفقات العامة لكائن الوظيفة التي تم إنشاؤها. إذا كان كائن رسالتك مصنوع بالكامل بالفعل (رسالة ثابتة) هذا النفقات العامة غير ضرورية.

الطريقة المناسبة لحالة استخدامك ستكون على غرار Sprintf:

assert(a == b,  "%s is not equal to %s", a, b)

طالما هناك وظيفة جديدة

assert(Boolean, String, Any, Any)

هذا التنفيذ لا يحتوي على النفقات العامة أو تكلفة صفيف Var Args

assert(Boolean, String, Any*)

للحالة العامة.

سيتم تقييم تنفيذ Tostring في التنفيذ، لكنه غير قابل للقراءة:

assert(a == b, new { override def toString =  a + " is not equal to " + b })

نصائح أخرى

إنه بالاسم، لقد غيرت ذلك منذ أكثر من عام.

http://www.scala-lang.org/node/825.

Predef الحالي:

@elidable(ASSERTION)
def assert(assertion: Boolean, message: => Any) {
  if (!assertion)
    throw new java.lang.AssertionError("assertion failed: "+ message)
}

إجابة توماس رائعة، ولكن فقط في حالة مثل فكرة الإجابة الأخيرة ولكن لا تعجبك غير مراعدي، يمكنك الحصول عليها:

object LazyS {
  def apply(f: => String): AnyRef = new {
    override def toString = f
  }
}

مثال:

object KnightSpeak {
  override def toString = { println("Turned into a string") ; "Ni" }
}

scala> assert(true != false , LazyS("I say " + KnightSpeak))

scala> println( LazyS("I say " + KnightSpeak) )
Turned into a string
I say Ni

يحاول: assert( a==b, "%s is not equals to %s".format(a,b))يجب استدعاء التنسيق فقط عندما يحتاج التأكيد إلى السلسلة. يضاف التنسيق إلى ريتشترينج عبر ضمنية.

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