[php] expr ? statement : statement

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Form
{
    private $name = null;
    public function addName($name)
    {
        $this->name = $name;
    }
    
    public function getName()
    {
        if(isset($this->name))
            return $this->name;
        return null;
    }

//...
//en nog veel meer methods
    
    public function getHTML()
    {
        $output = "<input type=\"".$this->getType()."\" ".(!empty($this->getName)) ? "name=\"".$this->getName()."\"" : "".">";
        $output .= ...;
        return $output;
    }
}

echter als ik met het expr ? statement : statement werk krijg ik de error: Can't use method return value in write context, alles gaat goed zolang ik zo werk:
PHP:
1
2
3
4
5
6
public function getHTML()
{
   $test = null;
   (!empty($test)) ? "a" : "b";
   return "iets";
}


doe ik echter zo:
PHP:
1
2
3
4
5
6
7
8
9
10
public function testReturn()
{
   return;
}

public function getHTML()
{
   (!empty($this->testReturn())) ? "a" : "b";
   return "iets";
}

dan gaat het dus fout en krijg ik de error: Can't use method return value in write context.

Het is een zeer vervelend probleem ik heb niet veel zin om tussen variabelen te gebruiken of mijn $output op te gaan splitsen in if ... else statements omdat ik zo direct met een 20 - 30 regels statements ga zitten. En dit voor iemand anders rommelig is

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Heeft het er niet mee te maken dat Emtpy niet de return value van een functie of method kan checken?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
edit:
Hmmmm, misschien toch even nog een keer je topicstart lezen :P

[ Voor 90% gewijzigd door RobIII op 24-11-2008 17:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
public function testReturn()
{
   return;
}

public function getHTML()
{
   (!empty($this->testReturn())) ? "a" : "b";
   return "iets";
}
?>

Dit is zowiezo fout. Het resultaat van je evaluatie wijs je niet toe.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
BtM909 schreef op maandag 24 november 2008 @ 17:27:
Heeft het er niet mee te maken dat Emtpy niet de return value van een functie of method kan checken?
Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).
Maarja, is een variabele in een object ook niet 'slechts een variabele'?

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Ik snap even niet wat je precies wilt. empty() checkt of een variable "empty" is. Als je een method hebt die iets test, waarom laat je die dan niet true/false opleveren, of een andere waarde waarop je kunt checken?

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
@ BtM909, bedankt voor zeer snelle reactie
ahja juist ja, ik zat even op compleet verkeerde spoor ...
($this->Test() != null)?"a":"b";
werkt wel, waarom ben ik daar niet eerder opgekomen, waarschijnlijk omdat het tijd is voor een pauze :p
het antwoord stond eigenlijk voor mijn neus ik heb het zelf getypt, nuja het nut van forum is nogmaals bewezen, iemand anders met frisse kijk ziet het direct.

bedankt voor alle reacties, fijn dat er direct massaal op gereageerd werd :*)

[ Voor 9% gewijzigd door Precision op 24-11-2008 17:42 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Snake schreef op maandag 24 november 2008 @ 17:30:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
public function testReturn()
{
   return;
}

public function getHTML()
{
   (!empty($this->testReturn())) ? "a" : "b";
   return "iets";
}
?>

Dit is zowiezo fout. Het resultaat van je evaluatie wijs je niet toe.
dit is ook maar om te testen, het staat dan ook niet in de context waar het gebruikt wordt, was soort van voorbeeld a, voorbeeld b, sorry als dit niet duidleijk was

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 18-09 22:29
Je hebt simpelweg een ) te veel na je empty.
PHP:
1
2
3
(!empty($this->getName)) ? "name=\"".$this->getName()
//wordt:
(!empty($this->getName) ? "name=\"".$this->getName())

[ Voor 66% gewijzigd door Depress op 24-11-2008 21:47 . Reden: Code added ]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 17:19
code:
1
(!empty($this->getName))
Dit kan niet kloppen. :)
Depress schreef op maandag 24 november 2008 @ 21:45:
Je hebt simpelweg een ) te veel na je empty.
PHP:
1
2
3
(!empty($this->getName)) ? "name=\"".$this->getName()
//wordt:
(!empty($this->getName) ? "name=\"".$this->getName())
Volgens mij heeft 'ie een '(' te weinig en heb je het alleen maar erger gemaakt. :P

[ Voor 75% gewijzigd door Jaap-Jan op 24-11-2008 21:48 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Als ik de error zo lees moet je $this->testReturn eerst aan een variabel hangen, en je haakjes zijn fout.

PHP:
1
2
$var = $this->testReturn();
echo (!empty($var) ? 'a' : 'b');

[ Voor 14% gewijzigd door Verwijderd op 24-11-2008 21:49 ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Verwijderd schreef op maandag 24 november 2008 @ 21:48:
Als ik de error zo lees moet je $this->testReturn eerst aan een variabel hangen, en je haakjes zijn fout.

PHP:
1
2
$var = $this->testReturn();
echo (!empty($var) ? 'a' : 'b');
Waarschijnlijk is het zo iets idioot.

Net gelijk je een functie die een array niet returned niet kan accessen op index van die array. Ook idioot.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
empty is dan ook een language construct en geen functie, vergelijkbaar met isset.
Staat gewoon in de handleiding:
Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).
edit: hm Osiris noemde het ook al :)

[ Voor 5% gewijzigd door user109731 op 24-11-2008 23:06 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Snake schreef op maandag 24 november 2008 @ 22:25:
[...]

Waarschijnlijk is het zo iets idioot.

Net gelijk je een functie die een array niet returned niet kan accessen op index van die array. Ook idioot.
Dat laatste is idioot, dat eerste niet. Met empty test je een variabele. Niet de waarde van een variabele, en dus ook niet het resultaat van een expressie. Logisch ook, want als de variabele niet bestaat is de expressie ongeldig.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

sidenote: ik ben misschien niet bekend genoeg met PHP, maar de ? : operator is toch essentieel een assignment operator, dus
C++:
1
int a = some_expr() ? 1 : 2;

maar als je de result van de operator niet gebruikt, volstaat het evalueren van de expressie :)

-niks-


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MLM schreef op dinsdag 25 november 2008 @ 09:18:
sidenote: ik ben misschien niet bekend genoeg met PHP, maar de ? : operator is toch essentieel een assignment operator, dus
C++:
1
int a = some_expr() ? 1 : 2;

maar als je de result van de operator niet gebruikt, volstaat het evalueren van de expressie :)
je hoeft volgens mij niet perse te assignen
PHP:
1
!empty( $var ) ? DoSomething( $var ) : DoDefault();

Is volgens mij ook gewoon correct ( maar ben ook geen PHP expert ), maar in veel talen is het idd een assignment

[ Voor 3% gewijzigd door Woy op 25-11-2008 09:32 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, er is niets "assignments" aan. Het is gewoon een expressie, die afhankelijk van het eerste operand de tweede of de derde evalueert. Gewoon een verkapte if-then-else als expressie dus. Dit werkt immers ook:
PHP:
1
func($a > 10 ? 1 : 2);

Als je dit een assignment noemt dan is de + operator bijvoorbeeld ook een assignment.

[ Voor 15% gewijzigd door .oisyn op 25-11-2008 12:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op dinsdag 25 november 2008 @ 12:06:
Nee, er is niets "assignments" aan. Het is gewoon een expressie, die afhankelijk van het eerste operand de tweede of de derde evalueert. Gewoon een verkapte if-then-else als expressie dus. Dit werkt immers ook:
PHP:
1
func($a > 10 ? 1 : 2);

Als je dit een assignment noemt dan is de + operator bijvoorbeeld ook een assignment.
Ok het is inderdaad een expressie, ik had moeten zeggen dat het vaak geen valide Statement op zichzelf is.

In bijvoorbeeld C# mag het volgende niet ( als los statement dus )
C#:
1
myBool ? Foo() : Bar();

Volgens mij heb ik dat wel eens in PHP gezien dat dat wel mocht, maar dat weet ik dus niet zeker.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat lijkt me wel raar, elke expressie is valide als statement in de meeste C-dialecten. Gewoon a+b als statement mag ook. Komt het niet gewoon omdat Foo en Bar void returnen? In C++ mag dat namelijk gewoon (als ze iets anders dan void returnen)

[ Voor 13% gewijzigd door .oisyn op 25-11-2008 12:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op dinsdag 25 november 2008 @ 12:23:
Dat lijkt me wel raar, elke expressie is valide als statement in de meeste C-dialecten. Gewoon a+b als statement mag ook. Komt het niet gewoon omdat Foo en Bar void returnen?
Deze code
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Test()
{
    true ? Foo() : Bar();
}

object Foo()
{
    return new object();
}

object Bar()
{
    return new object();
}

levert deze compile error op
Only assignment, call, increment, decrement, and new object expressions can be used as a statement
Ik was er eerst ook verbaasd over, maar dacht dat het dus ook in c/c++ etc zo was :). Blijkbaar niet dus.

C#:
1
2
int a, b;
a + b;

mag dus ook niet in C#. Op zich ook niet zo vreemd als je defineert dat de + geen side effects op a en b moet hebben.
In C++ mag dat namelijk gewoon (als ze iets anders dan void returnen)
Waarom mag het wel als ze iets returnen ( Waar niks mee gedaan word ), en niet als ze void returnen?

[ Voor 28% gewijzigd door Woy op 25-11-2008 12:42 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
rwb schreef op dinsdag 25 november 2008 @ 12:37:
mag dus ook niet in C#. Op zich ook niet zo vreemd als je defineert dat de + geen side effects op a en b moet hebben.
Het kan wel handig zijn icm operator overloading zoals in C++:
C++:
1
foo << bar;
Waarom mag het wel als ze iets returnen ( Waar niks mee gedaan word ), en niet als ze void returnen?
Ik denk omdat je 'void' niet kunt toewijzen aan een variabele of kunt gebruiken in een expressie. ?: moet altijd een waarde opleveren, maar dat kan niet als 1 van de 'takken' naar void evalueert.

[ Voor 11% gewijzigd door user109731 op 25-11-2008 13:14 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
JanDM schreef op dinsdag 25 november 2008 @ 13:02:
[...]
Het kan wel handig zijn icm operator overloading zoals in C++:
C++:
1
foo << bar;
Ja maar daar veraderd de << operator foo dus wel. Ik bedoelde dat als je de + operator defineert zodat die geen invloed heeft op de operands, dat het dan ook een onzinnig statement is.
Ik denk omdat je 'void' niet kunt toewijzen aan een variabele of kunt gebruiken in een expressie. ?: moet altijd een waarde opleveren, maar dat kan niet als 1 van de 'takken' naar void evalueert.
O ja natuurlijk.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

rwb schreef op dinsdag 25 november 2008 @ 12:37:
Waarom mag het wel als ze iets returnen ( Waar niks mee gedaan word ), en niet als ze void returnen?
scratch dat, het mag wel. Het punt is meer dat de ?: operator zelf ook weer iets moet returnen, wat niet kan als de twee functies void returnen. Maar dat kan wel, het resultaat van de ?: is dan ook void. Maar de twee types moeten wel compatible zijn (of om precies te zijn, het type van de derde expressie moet impliciet converteerbaar zijn naar het type van de tweede expressie)
JanDM schreef op dinsdag 25 november 2008 @ 13:02:
Ik denk omdat je 'void' niet kunt toewijzen aan een variabele of kunt gebruiken in een expressie.
Dat laatste kan wel (waardoor ik ook wel kon vermoeden dat het natuurlijk wel werkte met ?: ). Dit mag ook:
C++:
1
2
void a() { }
void b() { return a(); }

Als je het niet kon gebruiken dan kon je ook geen void functies aanroepen (dat zijn immers expressies die void opleveren). Je mag alles ook gewoon casten naar void (wat in bovenstaande voorbeeld zou moeten als a() bijv. een int zou returnen)

[ Voor 51% gewijzigd door .oisyn op 25-11-2008 13:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
.oisyn schreef op dinsdag 25 november 2008 @ 12:06:
Nee, er is niets "assignments" aan. Het is gewoon een expressie, die afhankelijk van het eerste operand de tweede of de derde evalueert. Gewoon een verkapte if-then-else als expressie dus. Dit werkt immers ook:
PHP:
1
func($a > 10 ? 1 : 2);

Als je dit een assignment noemt dan is de + operator bijvoorbeeld ook een assignment.
Hmm, kan me herinneren dat het gebruiken van ?: voor zijn side-effects nou niet echt als good practice wordt gezien.

Imho : Als je if_then_else bedoeld gebruik dan ook if_then_else.

[edit]
Daarmee bedoel ik niet het voorbeeld dat je hier geeft maar de vorm waarin de TS het gebruikt.

[ Voor 7% gewijzigd door farlane op 25-11-2008 14:09 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
.oisyn schreef op dinsdag 25 november 2008 @ 13:53:
Als je het niet kon gebruiken dan kon je ook geen void functies aanroepen (dat zijn immers expressies die void opleveren).
Hm natuurlijk, stom dat ik daar niet aan dacht :)

De topic titel is ook een beetje vreemd, een statement kan niet in een expressie

[ Voor 3% gewijzigd door user109731 op 25-11-2008 14:28 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op dinsdag 25 november 2008 @ 13:53:
[...]
(of om precies te zijn, het type van de derde expressie moet impliciet converteerbaar zijn naar het type van de tweede expressie)
In C# hoeft dat niet precies op die manier. Daar is
C#:
1
2
3
4
5
6
7
8
class Foo
{
}

class Bar : Foo
{
}
Foo foo = expression ? new Bar() : new Foo();

ook valide omdat het target type Foo is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Derived is toch ook impliciet te converteren naar Base?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
farlane schreef op dinsdag 25 november 2008 @ 14:50:
Derived is toch ook impliciet te converteren naar Base?
Derived wel naar Base, maar Base niet naar Derived.

Het type van de 2 expressie is Bar en daar is Foo niet (impliciet of expliciet) naar te converteren. .oisyn gaf aan dat het in c/c++
het type van de derde expressie moet impliciet converteerbaar zijn naar het type van de tweede expressie
Wat in mijn voorbeeld dus niet opgaat, maar wel in C# kan

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Heb het even opgezocht, in C# werkt het zo:
Let X and Y be the types of the second and third operands. Then,

* If X and Y are the same type, then this is the type of the conditional expression.
* Otherwise, if an implicit conversion exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
* Otherwise, if an implicit conversion exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
* Otherwise, no expression type can be determined, and a compile-time error occurs.
Dit is dus het tweede geval :)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
JanDM schreef op dinsdag 25 november 2008 @ 15:00:
Heb het even opgezocht, in C# werkt het zo:

[...]

Dit is dus het tweede geval :)
Inderdaad, bij de volgende code weet hij er geen raad meer mee ;)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
    public static implicit operator Bar(Foo input)
    {
        return new Bar();
    }
}

class Bar
{
    public static implicit operator Foo ( Bar input )
    {
        return new Foo();
    }
}
Foo foo = expression ? new Bar() : new Foo();

Dan komt de logische melding
Type of conditional expression cannot be determined because 'Bar' and 'Foo' implicitly convert to one another

[ Voor 3% gewijzigd door Woy op 25-11-2008 15:13 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
rwb schreef op dinsdag 25 november 2008 @ 15:12:
[...]

Inderdaad, bij de volgende code weet hij er geen raad meer mee ;)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
    public static implicit operator Bar(Foo input)
    {
        return new Bar();
    }
}

class Bar
{
    public static implicit operator Foo ( Bar input )
    {
        return new Foo();
    }
}
Foo foo = expression ? new Bar() : new Foo();

Dan komt de logische melding

[...]
Op zich wel vreemd, beide statements zijn te converteren naar Foo, het type waar je het aan toekent.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Toekennig doet er niet toe, een subexpressie staat compleet los van de context waarin ie gebruikt wordt. De ?: wordt dus eerst geevalueerd, en pas daarna wordt gekeken of het resultaat van de ?: wel compatible is met de assignment. Maar de ?: zelf is al ambigu, vandaar de error.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

.oisyn schreef op woensdag 26 november 2008 @ 01:00:
Toekennig doet er niet toe, een subexpressie staat compleet los van de context waarin ie gebruikt wordt. De ?: wordt dus eerst geevalueerd, en pas daarna wordt gekeken of het resultaat van de ?: wel compatible is met de assignment. Maar de ?: zelf is al ambigu, vandaar de error.
Dat snap ik niet?

Waarom is die ?: zelf ambigu?

En zowiezo begrijp ik niet waarom C# daarover moeilijk doet.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Snake schreef op woensdag 26 november 2008 @ 08:03:
[...]

Dat snap ik niet?

Waarom is die ?: zelf ambigu?

En zowiezo begrijp ik niet waarom C# daarover moeilijk doet.
Omdat de types beide kanten op te converteren zijn. Als ze er dan bijvoorbeeld gewoon het type van de eerste pakken is het volgende niet meer waar.

true ? A : B == false ? B : A

Het word dan ook een beetje onvoorspelbaar gedrag. Uit de Quote van JanDM volgt natuurlijk ook meteen dit gedrag. Ook komt het natuurlijk niet vaak voor dat je 2 weg impliciete conversies hebt, meestal gaat die maar een kant op, en de andere kant is een expliciete conversie ( Widening/Narrowing Conversions )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

rwb schreef op woensdag 26 november 2008 @ 08:59:
[...]

Omdat de types beide kanten op te converteren zijn. Als ze er dan bijvoorbeeld gewoon het type van de eerste pakken is het volgende niet meer waar.

true ? A : B == false ? B : A
Does that matter? Nergens staat dat ?: commutatief moet zijn. C#'s manier heeft zowel voordelen als nadelen tov C++'s manier. Het voordeel is idd dat de volgorde niet boeit en dat je dus ook kunt beginnen met een type dat converteerbaar is naar de andere (in C++ heb je dan een expliciete cast nodig, of je moet de operands (en de conditie) omdraaien). Het nadeel is dat daardoor wel ambiguities kunnen ontstaan, zoals in bovenstaand voorbeeld.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Wat zijn in C++ de officiele regels dan want als ik de MSDN beschrijving van MS lees dan lijkt die toch erg sterk op de C# versie:
If both expressions are of pointer types or if one is a pointer type and the other is a constant expression that evaluates to 0, pointer conversions are performed to convert them to a common type.
Er staat dus niet zozeer dat de derde naar de tweede geconverteerd wordt.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hmm, blijkbaar zit ik er naast. C++ doet het idd zoals C# het ook doet. Ik kan me toch sterk herinneren dat ik hier ooit eens ruzie mee had met VC++.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

rwb schreef op dinsdag 25 november 2008 @ 12:37:
[...]
C#:
1
2
int a, b;
a + b;

mag dus ook niet in C#. Op zich ook niet zo vreemd als je defineert dat de + geen side effects op a en b moet hebben.
Erm, wat hebben side effects (i.e. state changes) hiermee te maken? :-)

In ruby wordt dit overigens gewoon toegestaan, i.e.:
Ruby:
1
2
3
4
5
6
7
8
9
10
11
def groter
    puts "groter"
end

def kleiner
    puts "kleiner"
end

a = 5
b = 4
(a > b) ? groter : kleiner


In het geval van C# is denk ik de beredenering dat type conversie mogelijk moet zijn, maar imho zou dit hoe dan ook altijd mogelijk moeten zijn m.u.v. void expressies: casten naar Object (evt als boxed type) in het geval dat de types in de ternary expressie niet specifieke typevarianten van elkaar zijn, i.e. geen specifiekere gemeenschappelijke contravariant type hebben dan Object.

[ Voor 17% gewijzigd door prototype op 27-11-2008 04:27 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
.oisyn schreef op woensdag 26 november 2008 @ 16:47:
Hmm, blijkbaar zit ik er naast. C++ doet het idd zoals C# het ook doet. Ik kan me toch sterk herinneren dat ik hier ooit eens ruzie mee had met VC++.
Het stuk komt uit de docs van VC2008 volgens mij dus het zou best kunnen dat een oudere versie wat "beperkter" was :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
prototype schreef op donderdag 27 november 2008 @ 04:25:
Erm, wat hebben side effects (i.e. state changes) hiermee te maken? :-)
Ik bedoel dat als de + operator geen wijzigingen uitvoert op a of b, a + b een zinloos statement is en dus niet gek dat het niet is toegestaan.
In het geval van C# is denk ik de beredenering dat type conversie mogelijk moet zijn, maar imho zou dit hoe dan ook altijd mogelijk moeten zijn m.u.v. void expressies: casten naar Object (evt als boxed type) in het geval dat de types in de ternary expressie niet specifieke typevarianten van elkaar zijn, i.e. geen specifiekere gemeenschappelijke contravariant type hebben dan Object.
Op zich zou er wat voor te zeggen zijn als er idd naar de "Grootst gemene deler" gecast zou worden, worst case zou dat idd object zijn.

Maar opzich is dat in deze ook mogelijk, alleen dan moet je een van de twee explicieet naar object moeten casten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1