Re: Scala beginner question
Naftoli Gugenheim <[email protected]> Wed, 09 Mar 2016 16:50:47 +0000
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CANpg8PA+n0RJBy1kwk=rPRhTuXYQc+UF_2xmGpbhpXAoWaLZSA@mail.gmail.com> |
On Wed, Mar 2, 2016, 4:39 PM Kevin Wright <[email protected]> wrote: > Numerous better ideas… > > 1. You’re making checks against two different regexes that can be combined > into one. > 2. You’re attempting to match “.” in one of those expressions. This will > match any character unless you escape it to a literal with “\.” > 3. Anything used in a pattern match should begin with an uppercase letter > > *Taking points 1,2,3 into consideration:* > > val UnwantedChar = """[0-9]|\.|;|,|"|:""".r > > 4. You don’t need to supply the empty parameter block when calling > `toLowerCase`. By convention, this syntax is only used for methods with > side effects, not for simple getters or conversions > 5. You’re explicitly converting a String to a StringOps - This is already > done for you via the magic of implicits > 6. When pattern matching against a regex, it destructures the string > according to any capture groups you’ve defined “(…)” in the regex. You > haven’t specified any, so the “(_*)”s in your matches are useless > 7. A succession of case statements wrapped in braces defines a > `PartialFunction` (which is a subclass of `Function`); so you don’t need to > write “(c) => c match” > > This gives: > > private def transformContent(content: String): String = { > content.toLowerCase filter { > case UnwantedChar => false > Without parentheses it won't use the extractor, it will check if it == the regex. > case _ => true > } > } > > 8. Using filter here is inefficient. Regexes already have a method for > locating and replacing all matches in a string > > private def transformContent(content: String): String = > UnwantedChar.replaceAllIn(content.toLowerCase, "") > > > 9. Iterators are a good way to deal with lazy and potentially infinite > lists. `takeWhile` can then be used to catch the terminal null condition. > > import scala.io.StdIn > val inputLines = Iterator continually StdIn.readLine() takeWhile (_ != > null) > // note the () … because readLine() *is* side-effecting > for(line <- inputLines) { > … > } > > 10. The `transformContent` method is now so short that it’s easier to > write the content inline > 11. Try to avoid side-effects in the middle of other blocks of code, > they’re better at the boundary of your app > > Putting it all together: > > import scala.io.StdIn > val UnwantedChar = """[0-9]|\.|;|,|"|:""".r > val inputLines = Iterator continually StdIn.readLine() takeWhile (_ != > null) > val filteredInputLines = inputLines map {line => > UnwantedChar.replaceAllIn(line.toLowerCase, "") > } > filteredInputLines foreach println > > > On 2 March 2016 at 16:39, Pietro <[email protected]> wrote: > >> Hi everybody, >> >> I am not even sure this is the right place to ask this beginner >> questions nevertheless I do prefer gmane.* to StackOverflow and I wanted >> to give to it a try; feel free to point me to the right newsgroup if >> this isn't the most proper place. >> >> I have recently started to write a simple project in Scala, I got stuck >> in solving a couple of reasonalble simple problems; as many others I am >> from a imperative Java/C background and I am striving to change mindset. >> >> The following function should wipe out all the digits and punctuation >> characters present in the given string "content", anyway the match >> statement never matches where I expect and the string does not get >> modified. >> >> Is there a big mistake I haven't noticed ? >> >> val digitRE = """[0-9]""".r >> val punctuationRE = """.|;|,|"|:""".r >> >> private def transformContent(content : String) : String = { >> val _ret = new StringOps(content) >> _ret.toLowerCase().filter( >> (c) => { >> c match { >> case digitRE(_*) => false >> case punctuationRE(_*) => false >> case _ => true >> } >> }) >> } >> >> Then comes my next question, I would like to write a loop which reads >> from the console user's input and stops when the the user enters a null >> value, that is, they presses ENTER without having entered any characters >> before it. >> >> This is one of my several attempt to achieve it, it obviously does >> not work properly. >> >> while ( (path = readLine()) != null) >> println(path) >> } >> >> The only working solution I have got so far is to >> throw an exception, something like : >> >> try { >> while (true) { >> if (whatever) >> throw AllDone >> } >> >> }catch (AllDone) { >> ... >> } >> >> Any better ideas ? >> >> -- > You received this message because you are subscribed to the Google Groups > "scala-language" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "scala-language" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.