Yes, this does help a bit.
I actually understand the Can (and Option) very well, and I think it's a
great idea (though the added advantage of the Can doesn't seem to be
heavily used yet).
The problem I was having was dealing with cans inside cans inside cans.
But after reading everything everyone sent, I think I've got it now:
val p =
S.request.flatMap(_.location).flatMap(_.createDefaultLink).map(_.text)
<a href={p.openOr("")}>This page</a>
Or this:
val p = for (req <- S.request;
loc <- req.location;
txt <- loc.createDefaultLink) yield txt
<a href={p.openOr("").toString}>This page</a>
Of course, now that I know, I'll just use S.uri.
Thanks again for all the help!
Chas.
David Pollak wrote:
> Charles,
>
> A Can is a container... it can contain a thing or be empty.
>
> You can transform the contents of a Can from one thing to another using
> map(). map() on Can, Option, List is exactly the same as map() on Array
> in Ruby:
> irb(main):004:0> [1,2,3].map{|v| v.to_s + " Cats"}
> => ["1 Cats", "2 Cats", "3 Cats"]
>
> This is just like in Scala:
> scala> List(1,2,3).map(v => v.toString + " Cats")
> res0: List[java.lang.String] = List(1 Cats, 2 Cats, 3 Cats)
>
> In Ruby, when you access the first element of an Array that has no
> elements, you get 'nil' back. In Scala, you get an exception. This
> allows you to tell the difference between [nil][0] and [][0] which are
> the same in Ruby.
>
> The most syntactically pleasing way of extracting things from List, Can,
> Option in Scala is the "for" comprehension:
>
> scala> for (a <- Some(3);
> | b <- Some(4)) yield a * b
> res1: Option[Int] = Some(12)
>
>
> Does that help?
>
> Thanks,
>
> David
>
>
>
> Charles F. Munat wrote:
>> Thanks. I have read everything I could find on this but I think I'm just
>> a bit dense about it. Probably, it's just unfamiliarity with the syntax
>> of Scala as a whole and functional programming in general (or maybe I'm
>> just stupid). Hopefully, at some point the light bulb will come on and
>> this will seem easy. I'll read the blog post.
>>
>> Chas.
>>
>> David Pollak wrote:
>>
>>> Please also see:
>>> http://blog.lostlake.org/index.php?/archives/50-The-Scala-Option-class-and-how-lift-uses-it.html
>>>
>>> Can[T] is just like Option[T]
>>>
>>> Marius wrote:
>>>
>>>> to get stuff out of a can you can do:
>>>>
>>>> 1. Pattern matching
>>>>
>>>> having c a Can[String]
>>>>
>>>> c match {
>>>> case Full(value) => //do something with the value
>>>> case _ =>
>>>> }
>>>>
>>>> 2. call open_!(if you're sure your can is not empty) or openOr
>>>>
>>>> Br's,
>>>> Marius
>>>>
>>>> On Oct 15, 3:22 am, "Charles F. Munat" <[EMAIL PROTECTED]> wrote:
>>>>
>>>>
>>>>> I must be very dense, but these cans are kicking my butt (kicking my
>>>>> can?). No matter what I do, I seem to end up with everything back in the
>>>>> can! I just... want... to get... the goodies... OUT!
>>>>>
>>>>> An example:
>>>>>
>>>>> How do I extract the URI of the current page from S.request?
>>>>>
>>>>> I am currently doing something immensely stupid and wrong like this:
>>>>>
>>>>> S.request.toList.head.location.toList.head.createDefaultLink.toList.head.text
>>>>>
>>>>> I *know* this is way wrong, but I'm not clever enough, apparently, to
>>>>> figure out the puzzle, despite reading through the Can code repeatedly.
>>>>> I figure the above works only because what I'm looking for is there,
>>>>> which sort of defeats the purpose of the cans...
>>>>>
>>>>> Can anyone help? This is driving me insane.
>>>>>
>>>>> Chas.
>>>>>
>>>>>
>>>>
>>>>
>>
>>
>>
>
> >
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Lift" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---