Refactoring Val إلى طريقة النتائج في خطأ في تجميع الوقت

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

  •  19-09-2019
  •  | 
  •  

سؤال

أنا حاليا

  def list(node: NodeSeq): NodeSeq = {
    val all = Thing.findAll.flatMap({
      thing => bind("thing", chooseTemplate("thing", "entry", node),
        "desc" -> Text(thing.desc.is),
        "creator" -> thing.creatorName.getOrElse("UNKNOWN"),
        "delete" -> SHtml.link("/test", () => delete(thing), Text("delete"))
        )
    })

    all match {
      case Nil => <span>No things</span>
      case _ => <ol>{bind("thing", node, "entry" -> all)}</ol>
    }
  }

وحاولت إعادة تعدادها ل

  def listItemHelper(node: NodeSeq): List[NodeSeq] = {
    Thing.findAll.flatMap({
      thing => bind("thing", chooseTemplate("thing", "entry", node),
        "desc" -> Text(thing.desc.is),
        "creator" -> thing.creatorName.getOrElse("UNKNOWN"),
        "delete" -> SHtml.link("/test", () => delete(thing), Text("delete"))
        )
    })
  }

  def list(node: NodeSeq): NodeSeq = {
    val all = listItemHelper(node)

    all match {
      case Nil => <span>No things</span>
      case all: List[NodeSeq] => <ol>{bind("thing", node, "entry" -> all)}</ol>
      case _ => <span>wtf</span>
    }
  }

لكنني أحصل على ما يلي. لقد تتبعت جميع أنواع العائدات ولا أرى كيفية إعادة صياغتي مختلفة عن ما سيحدث داخليا. حاولت حتى إضافة المزيد من حالات المباريات (كما ترون في التعليمات البرمجية Refactored) للتأكد من أنني كنت أختار النوع الصحيح.

/Users/trenton/projects/sc2/supperclub/src/main/scala/com/runbam/snippet/Whyme.scala:37: error: overloaded method value -> with alternatives [T <: net.liftweb.util.Bindable](T with net.liftweb.util.Bindable)net.liftweb.util.Helpers.TheBindableBindParam[T] <and> (Boolean)net.liftweb.util.Helpers.BooleanBindParam <and> (Long)net.liftweb.util.Helpers.LongBindParam <and> (Int)net.liftweb.util.Helpers.IntBindParam <and> (Symbol)net.liftweb.util.Helpers.SymbolBindParam <and> (Option[scala.xml.NodeSeq])net.liftweb.util.Helpers.OptionBindParam <and> (net.liftweb.util.Box[scala.xml.NodeSeq])net.liftweb.util.Helpers.BoxBindParam <and> ((scala.xml.NodeSeq) => scala.xml.NodeSeq)net.liftweb.util.Helpers.FuncBindParam <and> (Seq[scala.xml.Node])net.liftweb.util.Helpers.TheBindParam <and> (scala.xml.Node)net.liftweb.util.Helpers.TheBindParam <and> (scala.xml.Text)net.liftweb.util.Helpers.TheBindParam <and> (scala.xml.NodeSeq)net.liftweb.util.Helpers.TheBindParam <and> (String)net.liftweb.util.Helpers.TheStrBindParam cannot be applied to (List[scala.xml.NodeSeq])
      case all: List[NodeSeq] => <ol>{bind("thing", node, "entry" -> all)}</ol>
                                                                  ^
هل كانت مفيدة؟

المحلول

إليك كيفية تحليل ذهني رسالة الخطأ ...

error: overloaded method value ->

هذا هو اسم الطريقة، وهو "->".

with alternatives 

ما سوف يتبع هو قائمة المعلمات المحتملة ل -> داخل وظيفة BIND ().

[T <: net.liftweb.util.Bindable](T with net.liftweb.util.Bindable)net.liftweb.util.Helpers.TheBindableBindParam[T] 

هذا يقول أن أي شيء ينفذ أو يشمل السمة قابلة للتغذية هي لعبة عادلة.

<and> (Boolean)net.liftweb.util.Helpers.BooleanBindParam 
<and> (Long)net.liftweb.util.Helpers.LongBindParam 
<and> (Int)net.liftweb.util.Helpers.IntBindParam 
<and> (Symbol)net.liftweb.util.Helpers.SymbolBindParam 
<and> (Option[scala.xml.NodeSeq])net.liftweb.util.Helpers.OptionBindParam 
<and> (net.liftweb.util.Box[scala.xml.NodeSeq])net.liftweb.util.Helpers.BoxBindParam 

مجموعة من الخيارات الخاصة بالنوع.

<and> ((scala.xml.NodeSeq) => scala.xml.NodeSeq)net.liftweb.util.Helpers.FuncBindParam 
<and> (Seq[scala.xml.Node])net.liftweb.util.Helpers.TheBindParam 
<and> (scala.xml.Node)net.liftweb.util.Helpers.TheBindParam 
<and> (scala.xml.Text)net.liftweb.util.Helpers.TheBindParam 
<and> (scala.xml.NodeSeq)net.liftweb.util.Helpers.TheBindParam 
<and> (String)net.liftweb.util.Helpers.TheStrBindParam 

آه! الاشياء ذات الصلة بالعقدة. يبدو أن خياراتنا الصالحة تكون NOTESEQ و SEQ [العقدة] والنص والعقدة

cannot be applied to (List[scala.xml.NodeSeq])

يبدو وكأنه قائمة [NODESEQ] ليس خيارا صالحا.

مع وضع ذلك في الاعتبار، ربما ترغب في إخراج NOTESEQ الفردية من القائمة من أجل ربطه بالشكل. هل أنت متأكد أنك تريد حقا إرجاع قائمة من طريقة المساعد؟

نصائح أخرى

لقد فشلت في معرفة أن NoDeseq يمتد SEQ [العقدة]، لذلك كان لدي نوع الإرجاع الخطأ على الطريقة المستخرجة. تغييرها إلى

  def listItemHelper(node: NodeSeq): NodeSeq = {
    Thing.findAll.flatMap({
      thing => bind("thing", chooseTemplate("thing", "entry", node),
        "desc" -> Text(thing.desc.is),
        "creator" -> thing.creatorName.getOrElse("UNKNOWN"),
        "delete" -> SHtml.link("/test", () => delete(thing), Text("delete"))
        )
    })
  }

  def list(node: NodeSeq): NodeSeq = {
    val all = listItemHelper(node)

    all.length match {
      case 0 => <span>No things</span>
      case _ => <ol>{bind("thing", node, "entry" -> all)}</ol>
    }
  }

يعمل.

قضية واحدة هي أن تطابقك لا معنى له حقا: أنت أساسا كنت مطابقا ضد قائمة فارغة أو قائمة غير فارغة. ليس هناك إمكانية أخرى:

all match {
  case Nil          =>  //if list is empty
  case nonEmptyList =>  //if list is not empty
}

بالطبع يمكنك أيضا القيام به:

case Nil       =>
case x :: Nil  => //list with only a head
case x :: xs   => //head :: tail

كملاحظة جانبية، هناك شيء واحد في التعليمات البرمجية التي لا تعمل:

case all: List[NodeSeq]

بسبب نوع محو, ، لا توجد وسيلة لاختبار، في وقت التشغيل، سواء all قائمة List[NodeSeq], List[String], List[AnyRef] أو ما لديك. أنا متأكد من أنك يجب أن تحصل على تحذير على هذا الخط، وتجاهلها لأنك لا تفهم ما تحذرك لك (على الأقل، وهذا ما حدث لي عندما أحصل على مثل هذا التحذير :). السطر الصحيح سيكون:

case all: List[_]

مما يقبل أي نوع من List. وبعد ابحث عن مسألة مني على محو النوع و Scala لرؤية المزيد عن ذلك، إذا كنت مهتما.

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