Lambda-Kompilierungsfehler, Referenz definiert in '' Bereich, aber nicht definiert




 In dem einfachen Ausschnitt unten: 


```
static void Main(string[] args)
{
    Expression<Func<string, bool>> equal = s => s == "test";
    LambdaExpression lambda = Expression.Lambda(equal.Body, Expression.Parameter(typeof(string), "s"));
    lambda.Compile();
}

```
  Die Kompiliermethode schlägt mit einer `InvalidOperationException` 


>  "Variable 's' vom Typ 'System.String' referenziert vom Gültigkeitsbereich '', aber es ist nicht definiert". 
> 
> 

 Während ich andere ähnliche Fragen gefunden habe, habe ich die Antworten nicht verstanden. 

 Die DebugView der LambdaExpression enthält Folgendes: 


```
.Lambda #Lambda1<System.Func`2[System.String,System.Boolean]>(System.String $s) {
    $s == "test"
}

```
  Also , wo ich in anderen Beispielen dieser Frage gesehen haben, die Parameter und die Verwendung nicht zusammenpassen, *scheint* dies kein Problem , hier zu sein. Was mache ich falsch?
Parameter von Lambda-Ausdrücken verwenden keine auf Namen basierende Gleichheit, sie verwenden Referenzgleichheit. In Ihrem Ausdruck haben Sie also zwei völlig verschiedene Parameter namens `s` , einer ist definiert, wird aber nicht verwendet, der andere wird verwendet, aber nicht definiert. 

 Also, im Grunde ist Ihr Ausdruck etwas wie `s1 => s2 == "test"` , weshalb er nicht kompiliert werden kann. Die einfachste Lösung wäre, denselben Parameter zu verwenden, den der ursprüngliche Ausdruck verwendet: 


```
LambdaExpression lambda = Expression.Lambda(equal.Body, equal.Parameters.Single());

```
  Wenn Sie wirklich Ihren eigenen Parameter verwenden möchten, müssten Sie alle Instanzen des ursprünglichen Parameters im Lambda-Body durch Ihren neuen Parameter ersetzen. Der beste Weg dies zu tun, ist [`ExpressionVisitor`](http://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor.aspx) zu verwenden.
Es steht schon in deiner eigenen Überschrift: **Wegen Assoziativität** (die du NICHT hier zumindest beweisen musst) gilt



```
((A·B)·C)·D = (A·B)·(C·D) = A·(B·(C·D)) = A·((B·C)·D)

```

und alles davon bezeichnen wir als A·B·C·D. Zweitens, sobald all diese äquivalenten Produkte berechnet wurden, erhältst du durch Transponieren:



```
(A·B·C·D)ᵀ = Dᵀ·Cᵀ·Bᵀ·Aᵀ.

```

Ende. Ich wiederhole: hier besteht die Aufgabe nicht darin, Assoziativität zu beweisen, sondern sie zu verwenden/erwähnen. So verstehe ich die Sprache des Übungsgruppenleiters zumindest. <p>die standardmethode für die angabe des objekttyps ist entweder <a href="http://search.cpan.org/perldoc?perlfunc#ref"><code>ref</code></a> oder <a href="http://search.cpan.org/perldoc?scalar::util"><code>scalar::util</code></a> <code>::blessed</code>. wenn sie<em> wissen </em>das objekt gesegnet ist, geben sie dieselbe information zurück. </p><pre><code>my $class1 = blessed( $obj ); my $class2 = ref $obj; </code></pre><p><code>ref</code> gibt jedoch auch 'hash' für nicht gesegnete hashes zurück, während <code>blessed</code> dieses spiel ablehnt. </p><p>für eine liste von methoden ist es für den gesegneten zeigerstil eines perl-objekts einfach, eine davon selbst zu codieren. der folgende code funktioniert ziemlich gut für mich. es gibt die namen der funktionen (diejenigen, die den &quot;code-slot&quot; des angegebenen namens annehmen) zurück, die dem paket zugeordnet sind, das sie definiert. </p><pre><code>sub class\_methods { use class::isa; my $obj = shift; return unless ref( $obj ); my %meth\_names; foreach my $anc ( class::isa::self\_and\_super\_path( ref $obj ), 'universal' ) { my $stash = \%{"$anc\::"}; my @funcs = grep { m/^[\_\p{alpha}]/ # begins with \_ or alpha &amp;&amp; !exists $meth\_names{$\_} # no clobbering &amp;&amp; defined *{$stash-&gt;{$\_}}{code} # has a filled code slot } keys %$stash ; # assign to the "hash slice", keyed by all the entries in @funcs # the value of $anc repeated as many times as elements in @funcs. @meth\_names{@funcs} = ( $anc ) x @funcs; } return %meth\_names; } </code></pre><ul> <li><p>dies funktioniert auch für relativ komplexe objekte, aber wenn das besitzende paket eine menge generierten codes enthält, ist es nicht besonders hilfreich zu wissen, in welchem ​​paket die generatoren den code-pointer stecken. es wird mehr bedeuten, welches paket zu finden ist generiert den code. </p></li> <li><p>ist dies der fall, erhalten sie<em> might </em>den code aus der ausführung ihres codes, einschließlich <a href="http://search.cpan.org/perldoc?data::dumper"><code>data::dumper</code></a> und setzen von <code>$data::dumper::deparse</code> auf 1 wie folgt: (<code>local $data::dumper::deparse = 1;</code>) und dann den code-zeiger wie folgt: <code>say dumper( $code\_ref );</code></p></li> <li><p>es<em> won't </em>funktioniert für gültige methoden, die noch mit einer beliebigen <code>autoload</code>-methode erstellt werden müssen. wenn sie diese in der liste sehen, macht das objekt möglicherweise mehr, aber was es alles tut, wissen sie nicht.</p></li> <li><p>die &quot;basisklasse&quot; <code>universal</code> ist enthalten, da diese klasse verhalten enthält, das vom objekt verwendet werden kann. </p></li> </ul><p>viel glück.</p> <p>die tastaturkombination, nach der sie suchen (<kbd>ctrl</kbd>+<kbd>k</kbd>, <kbd>ctrl</kbd>+<kbd>d</kbd>) dient der "formatierung" - aber nicht in dem maße, wie sie es zu erwarten scheinen. es ist kein prettifier, sondern dient nur zum einfügen korrekter abstände und tabulatoren wie in <code>tools &gt; options &gt; text editor &gt; transact-sql &gt; general/tabs</code>. wenn sie also einen teil des texts markieren und die tastaturkombination drücken, werden tabulatoren in 4 leerzeichen konvertiert ( wenn sie leerzeichen einfügen ausgewählt haben, wenden sie die von ihnen angegebene art des einrückens usw. an.</p><p>diese option soll den code nicht lesbarer machen. dies ist keine funktionalität, die management studio derzeit nativ bietet. es gibt zwar mehrere optionen von drittanbietern - einige befinden sich außerhalb von management studio, z.</p><ul> <li> <a href="http://extras.sqlservercentral.com/prettifier/prettifier.aspx">sql prettifier von simple-talk</a> </li> <li> <a href="http://poorsql.com/">schlechtes sql</a> (welches <a href="https://dba.stackexchange.com/a/45052/1186">thomas schlug vor</a> )</li> </ul><p>außerdem gibt es add-ins für verschiedene ebenen der formatierungsunterstützung im editor:</p><ul> <li> <a href="http://www.red-gate.com/products/sql-development/sql-prompt/features">sql-eingabeaufforderung von red-gate</a> </li> <li> <a href="http://ssmstoolspack.com/features?f=4">ssms tools pack</a> </li> <li> <a href="http://www.apexsql.com/sql\_tools\_refactor.aspx">apexsqls refactor</a> </li> <li> <a href="http://www.ssmsboost.com/features/ssms-add-in-format-sql-document">ssmsboost</a> </li> <li> <a href="http://www.devart.com/dbforge/sql/sqlcomplete/">dbforge sql complete</a> (welches <a href="https://dba.stackexchange.com/a/45063/1186">robert schlug vor</a> )</li> </ul><p>nun, der grund, warum sie die nachricht erhalten ...</p><blockquote> <p>die tastenkombination (strg + k, strg + d) ist an den befehl (format format) gebunden, der derzeit nicht verfügbar ist.</p> </blockquote><p>... liegt daran, dass ssms diese tastenkombination einem anderen kontext zugeordnet hat. die art und weise, wie sie <em> sollten</em> in der lage sein, dies zu "beheben" - auch hier würde es immer noch nicht das tun, was sie möchten, selbst wenn das "beheben" funktioniert - ist wie folgt:</p><ol> <li>gehe zu <code>tools &gt; options &gt; environment &gt; keyboard</code></li> <li>platzieren sie ihren cursor in das feld <code>press shortcut keys:</code></li> <li>schlagen <kbd>ctrl</kbd>+<kbd>k</kbd>, <kbd>ctrl</kbd>+<kbd>d</kbd></li> <li> <p>ändern sie das dropdown-menü <code>shortcut currently used by:</code> von <code>datawarehouse designer</code> in <code>text editor</code>.</p> <p><img src="https://i.stack.imgur.com/1g5oe.png" alt="enter image description here"></p> </li> <li> <p>drücke ok</p> </li> </ol><p>dies ist <em> angenommen</em>, um die tastaturkombination dem texteditor zuzuordnen, aber management studio setzt sie zurück, nachdem sie auf ok geklickt haben (sie erhalten weiterhin die fehlermeldung. ich denke, das problem ist das die dokumentation geht davon aus, dass diese funktionalität vorhanden ist, aber management studio weiß es besser und bietet sie einfach nicht an (und microsoft wird dies wahrscheinlich als fehler in der dokumentation abschreiben und korrigieren, anstatt als mangel im tool) hoffe in der zukunft, aber vorerst <a href="http://connect.microsoft.com/sql/feedback/viewfeedback.aspx?feedbackid=496617">dies ist ein bekanntes und weitgehend ignoriertes problem</a> . sie werden feststellen, dass die registerkarte <code>formatting</code> diese <a href="http://msdn.microsoft.com/en-us/library/ms174205(sql.110).aspx">die dokumentation bezieht sich auf</a> ist einfach nicht vorhanden (obwohl es für xml vorhanden ist, wo die tastaturkombination funktioniert). in der dokumentation sollte wahrscheinlich folgendes angegeben werden:</p><blockquote> <p>wendet die einrückungs- und leerzeichenformatierung für die sprache an, die im bereich <strong> formatierung </strong> der sprache im texteditor <strong> angegeben ist </strong> abschnitt des dialogfelds <strong> optionen </strong>. nur im texteditor verfügbar <strong> <em> und nur für bestimmte sprachen</em> </strong>.</p> </blockquote><p>eine andere möglichkeit, sich ein bild davon zu machen, welche art von formatierungsoptionen ssms nativ bietet, besteht darin, unter <code>tools &gt; customize &gt; commands &gt; edit &gt; add command... &gt; format</code> die liste der möglichen befehle dort anzuzeigen. nichts, was darauf hinweist, dass kenntnisse der tatsächlichen sprache vorhanden sind, sodass nicht bekannt ist, wo zeilenumbrüche eingefügt oder zusätzliche einrückungen hinzugefügt oder klammern usw. verwendet werden sollen.</p><p><img src="https://i.stack.imgur.com/zhrer.png" alt="enter image description here"></p><p>wenn sie eine sprachspezifische formatierung wünschen, um den vorhandenen t-sql-code besser lesbar zu machen, erhalten sie von ssms nicht viel, und sie müssen nach anderen optionen suchen.</p> <p>der identitätsoperator (<code></code>) verhält sich identisch mit dem gleichheitsoperator (<code>==</code>), mit der ausnahme, dass keine typkonvertierung durchgeführt wird und die typen identisch sein müssen, damit sie als gleich gelten.</p><p>referenz: <a href="http://www.c-point.com/javascript\_tutorial/jsgrpcomparison.htm">javascript tutorial: vergleichsoperatoren</a> </p><p>der operator <code>==</code> vergleicht die werte <em>, nachdem alle erforderlichen typkonvertierungen </em> durchgeführt wurden. der operator <code></code> führt die konvertierung <strong> nicht durch </strong>. wenn also zwei werte nicht vom selben typ sind, gibt <code></code> einfach <code>false</code>. beide sind gleich schnell.</p><p>um douglas crockfords vorzügliches zu zitieren <a href="https://rads.stackoverflow.com/amzn/click/com/0596517742">javascript: the good parts</a> ,</p><blockquote> <p>javascript hat zwei gruppen von gleichheitsoperatoren: <code></code> und <code>!==</code> und ihre bösen zwillinge <code>==</code> und <code>!=</code>. die guten arbeiten so, wie sie es erwarten würden. wenn die beiden operanden vom selben typ sind und denselben wert haben, dann erzeugt <code></code> <code>true</code> und <code>!==</code> <code>false</code>. die bösen zwillinge tun das richtige, wenn die operanden vom selben typ sind, aber wenn sie von unterschiedlichem typ sind, versuchen sie, die werte zu erzwingen. die regeln, nach denen sie das tun, sind kompliziert und nicht zu merken. dies sind einige der interessanten fälle:</p> <pre><code>'' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true </code></pre> <p>der mangel an transitivität ist alarmierend. mein rat ist, niemals die bösen zwillinge zu benutzen. verwenden sie stattdessen immer <code></code> und <code>!==</code>. alle soeben gezeigten vergleiche führen zu <code>false</code> mit dem operator <code></code>.</p> </blockquote><hr><h3>aktualisieren:</h3><p>ein guter punkt wurde von <a href="https://stackoverflow.com/users/165495/casebash">@ casebash</a> in den kommentaren und in <a href="https://stackoverflow.com/users/113570/philippe-leybaert">@ phillipe laybaerts</a> <a href="https://stackoverflow.com/a/957602/1288">antwort</a> in bezug auf referenztypen angesprochen. bei referenztypen handeln <code>==</code> und <code></code> konsistent miteinander (außer in besonderen fällen).</p><pre><code>var a = [1,2,3]; var b = [1,2,3]; var c = { x: 1, y: 2 }; var d = { x: 1, y: 2 }; var e = "text"; var f = "te" + "xt"; a == b // false a  b // false c == d // false c  d // false e == f // true e  f // true </code></pre><p>der sonderfall ist, wenn sie ein literal mit einem objekt vergleichen, das aufgrund seiner <code>tostring</code> - oder <code>valueof</code> -methode dasselbe literal ergibt. angenommen, sie vergleichen ein zeichenfolgenliteral mit einem zeichenfolgenobjekt, das vom konstruktor <code>string</code> erstellt wurde.</p><pre><code>"abc" == new string("abc") // true "abc"  new string("abc") // false </code></pre><p>hier überprüft der operator <code>==</code> die werte der beiden objekte und gibt <code>true</code> zurück, aber der operator <code></code> stellt fest, dass sie nicht vom selben typ sind und <code>false</code> zurückgeben. welches ist richtig? das hängt wirklich davon ab, was sie vergleichen wollen. mein rat ist, die frage vollständig zu umgehen und den konstruktor <code>string</code> nicht zum erstellen von zeichenfolgenobjekten zu verwenden.</p><p><strong> referenz </strong><br> <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3">http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.</a> </p> Hallo.

  

 In deiner Lösung sind mehrere Dinge nicht ganz richtig. Zum einen ist kann mit deiner Lösung das leere Wort erzeugt werden. $S \rightarrow \lambda$!

  

 Außerdem ist nicht gesichert, dass die Wörter länger als 4 Zeichen sind. Deine Grammatik erzeugt z.B. auch die Wörter 0, 1, 011, 00 und viele andere. Damit ist zudem nicht gesichert dass das Wort mit 01 beginnt und endet.

  

 Wichtiger ist allerdings noch, dass du die Regeln für eine  rechtslineare Grammatik beachten musst!

  

 Zur Erinnerung: $P\_{rechtsnlinear} \subset N \times (T \cup TN \cup \{\lambda\})$

  

 Deine Regel $S \rightarrow 01S$ ist allerdings von der Form "$N \rightarrow TTN$"

  

 Liebe Grüße,

  

 Leonard <p>die erste antwort ist gut und gibt einige strukturelle antworten, aber ein anderer ansatz besteht darin, darüber nachzudenken, was sie tun. bei modulen geht es darum, methoden bereitzustellen, die sie für mehrere klassen verwenden können - stellen sie sich diese als "bibliotheken" vor (wie sie es in einer rails app) sehen würden. bei klassen geht es um objekte, bei modulen um funktionen.</p><p>beispielsweise sind authentifizierungs- und autorisierungssysteme gute beispiele für module. authentifizierungssysteme funktionieren über mehrere klassen auf app-ebene (benutzer sind authentifiziert, sitzungen verwalten die authentifizierung, viele andere klassen verhalten sich je nach authentifizierungsstatus anders), sodass authentifizierungssysteme als gemeinsam genutzte apis fungieren.</p><p>sie können ein modul auch verwenden, wenn sie methoden für mehrere apps gemeinsam nutzen (auch hier ist das bibliotheksmodell gut).</p> Eine Route ist nur eine Funktion. Sie können also wie gewohnt Argumente übergeben:


```
<code>// Redirect to /hello/Bob
def helloBob = Action {
    Redirect(routes.Application.hello("Bob"))    
}
</code>
```
Dieser Ausschnitt stammt von<http://www.playframework.org/documentation/2.0/ScalaRouting> (unten) <p>in späteren versionen von pandas ergibt dies einen typeerror:</p><pre><code>df.replace('-', none) typeerror: if "to\_replace" and "value" are both none then regex must be a mapping </code></pre><p>sie können dies tun, indem sie entweder eine liste oder ein wörterbuch übergeben:</p><pre><code>in [11]: df.replace('-', df.replace(['-'], [none]) # or .replace('-', {0: none}) out[11]: 0 0 none 1 3 2 2 3 5 4 1 5 -5 6 -1 7 none 8 9 </code></pre><p>ich empfehle jedoch die verwendung von nans anstelle von none:</p><pre><code>in [12]: df.replace('-', np.nan) out[12]: 0 0 nan 1 3 2 2 3 5 4 1 5 -5 6 -1 7 nan 8 9 </code></pre> <p>was sie erstellen möchten, ist eine <a href="http://en.wikipedia.org/wiki/domain-specific\_language">domänenspezifische sprache</a> . das grundprinzip dieser art von (programmier-) sprache lautet: halten sie die syntax so einfach wie möglich, während sich einfach auf "vom menschen lesbar" bezieht, indem sie alle nicht benötigten funktionen entfernen.</p><h2>schwierigkeiten der c-syntax</h2><p>was macht c-syntax schwer zu schreiben:</p><ul> <li>fehlendes nachlaufen; ich habe viele anfänger gesehen, die auf diesem fluch waren.</li> <li>fehlend} oder).</li> <li>das konzept der zeiger <em> (sie werden diesen wahrscheinlich nicht brauchen) </em></li> <li>variable bereiche</li> <li>copy-by-value vs. referenzen</li> </ul><p>wenn sie eine kleine teilmenge der sprachfunktionen verwenden, ist der code sowohl leichter zu lesen als auch zu schreiben (sofern er konsistent ist).</p><h2>beispiel</h2><p>angenommen, der code muss ausdrücken, dass prozess a von prozess b abhängig ist.</p><pre><code>process a = "cook something"; process b = "go shopping."; depends\_on(a, b); </code></pre><p>oder:</p><pre><code>cook something &lt;- go shopping </code></pre><p>im zweiten beispiel muss der "codierer" nicht einmal das konzept der parameter kennen!</p><h2>technische komplexität beeinflusst die benutzerfreundlichkeit</h2><p>was am ende mindestens genauso wichtig sein kann: eine anständige kompilierungs-/debugging-umgebung, fehlermeldungen, die zur lösung des eigentlichen problems beitragen usw. aufgrund der technischen schwierigkeiten beim parsen von c gibt der compiler häufig nur schwache fehler aus im zusammenhang mit der wahren ursache. auch hier hilft eine einfache syntax.</p> <p>es wird in den stapel-auflösetabellen verwendet, die sie zum beispiel in der assembly-ausgabe von <a href="https://stackoverflow.com/questions/307610/how-do-exceptions-work-behind-the-scenes-in-c#307716">meine antwort auf eine andere frage</a> sehen können. wie in dieser antwort erwähnt, wird ihre verwendung durch <a href="https://itanium-cxx-abi.github.io/cxx-abi">itanium c++ abi</a> definiert, wobei sie <a href="https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#base-personality">personality routine</a> genannt wird.</p><p>der grund, warum es "funktioniert", indem es als globaler null-leerzeiger definiert wird, ist wahrscheinlich, dass nichts eine ausnahme auslöst. wenn etwas versucht, eine ausnahme auszulösen, werden sie feststellen, dass es sich schlecht benimmt.</p><p>wenn keine ausnahmen verwendet werden, können sie diese natürlich mit <code>-fno-exceptions</code> deaktivieren (und wenn rtti nicht verwendet wird, können sie auch <code>-fno-rtti</code> hinzufügen). wenn sie sie verwenden, müssen sie (wie andere bereits erwähnte antworten) mit <code>g++</code> anstelle von <code>gcc</code> verknüpfen, wodurch <code>-lstdc++</code> für sie hinzugefügt wird.</p>