23 Dec 23:34
Re: [scala] Scala Object Notation ( SCON? )
We could also have?
rolandDumas.firstname("Bertrand").age(33)
I am curious. Where in the lift code are you making these changes?
On Dec 23, 2007 5:05 PM, David Pollak <
feeder.of.the.bears <at> gmail.com> wrote:
I've been pestering the Scala folks for a way to update just one field in case classes and have a new instance spit out with just that one field changed for a very long time.
It would work like this:
val rolandDumas = Person("Roland", "Dumas", 0) // the factory instance
val first= rolandDumas.age(43) // a new instance with age 43
val second = rolandDumas.age(56) // yet another instance with age 56
You'll be able to get that functionality with some of the changes I'm making to lift, but baking it into the language would be nicer.On Dec 23, 2007 9:10 AM, Oscar Picasso <oscarpicasso-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:Case class was the first thing I thought when reading the beginning of this tread.
May it can be a partial answer to Rickard question.
case class Person(firstname: String, lastname: String, age: Int)
But, in a small village in France, they are many Roland Dumas that have different ages. Typing over and over Person("Roland", "Dumas", xxx) is boring.
So let's create a Roland Dumas maker.
scala> def rolandDumasMaker = Person("Roland", "Dumas", _: Int)
rolandDumasMaker: (Int) => Person
Now creating many Roland Dumases is becoming fun.
scala> rolandDumasMaker(45)
res5: Person = Person(Roland,Dumas,45)
scala> rolandDumasMaker(85)
res6: Person = Person(Roland,Dumas,85)
Sure, in many languages you can make this kind of factory but I find it more meaningful and fun the way you can define it in scala.On Dec 23, 2007 9:42 AM, David Pollak <feeder.of.the.bears-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:On Dec 23, 2007 3:44 AM, David Bernard <david.bernard.31-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:I thinks that with some change in Property you could support a builder approach that support
val w = new Widget()
.name("MyWidget")
.height(10)
.children(label, panel, button)
Which is what you get with lift components.
But I believe the larger issue is one of mutability and internal type representation.
JavaScript has JSON because it is pretty much built on hash tables and the built in types (numbers, Strings, dates, booleans, arrays and hashs/objects) are so limited in number that it makes sense to have special syntax for each of them.
Scala, too, has some special notation for building object hierarchies: case classes. One can build complex object hierarchies using case classes. In my opinion, they are as easy to read as JSON objects. They are a little more verbose to type, but that's because they're typed (ah hah... a pun.)
One can also do:
Map('foo -> Array(1,2,3), 'bar -> Array("dog", "cat"), 'baz -> Date("12-23-07"))
It's a little more verbose than JSON, but the objects are serializable as JSON (okay, I made up the Date thing, but it's not hard to implement.)
If you want the kind of unstructured hash tables you get with JavaScript, use Maps/Arrays (or Lists). If you want more structured stuff, where are case classes lacking?
Thanks,
David
my 2 cents.
/davidB
Andrés Testi wrote:
> Yes, but I don't like the fact of create a subclass of Person. I just
> want to instantiate a Person. Suppose you have this Widget class:
>
> class Widget{
> val name = new Property("")
> val width = new Property(0)
> val height = new Property(0)
> val children = new Property(Array[Widget]())
> }
>
> To populate the Widget properties without Object notation, you need to
> write the next code
>
> val w = new Widget
> p.name() = "MyWidget"
> p.height() = 10
> p.children() = Array(
> label, panel,button
> )
>
> the previous code is not Property-Editor friendly, because the
> "programmatic" nature. Then, a declarative syntax is the key. But
> creating annonimous class is not declarative but programmatic, because
> I would to assign a property 2 times:
>
> new Widget{
> name="MyWidget"
> name="YourWidget"
> }
>
> In the other hand, I don't like to subclass Widget, because I just
> want to instantiate Widget.
>
> 2007/12/22, martin odersky < martin.odersky-p8DiymsW2f8@public.gmane.org>:
>>> Hello:
>>> Is it possible to instantiate scala objects in a declarative way like
>>> JSON. I think this would be a solution:
>>>
>>> val p = new Person{
>>> name = "Peter"
>>> age = 20
>>> friends = Array(
>>> new Person{
>>> name = "Gary"
>>> }
>>> )
>>>
>>> }
>>>
>> Sure. That you wrote is legal Scala, assuming you declared Person like this:
>>
>> class Person {
>> var name: String = ""
>> var age: Int = 99
>> var friends: Array[Person] = Array()
>> }
>>
>> But maybe that's not what you wanted?
>>
>> Cheers
>>
>> -- Martin
>>
--
lift, the secure, simple, powerful web framework http://liftweb.net
Collaborative Task Management http://much4.us
--
lift, the secure, simple, powerful web framework http://liftweb.net
Collaborative Task Management http://much4.us
RSS Feed