Entschuldigung für den verwirrenden Titel. Ich denke, es ist einfacher zu verstehen, was es bedeutet, den Code tatsächlich zu betrachten, als ihn in Worten zu erklären. In Bezug auf die Umgebung ist Ruby Ruby 2.0 und Python Python 3.2.
Versuchen wir, diesen Code in Ruby zu schreiben.
#Globale Variablen aufgrund des Umfangs
$msg = "Hello, Before World!"
def say(str = $msg)
puts str
end
say #=> Hello, Before World!
$msg = "Hello, After World!"
say #=> Hello, After World!
Die Ausgabe sollte wie kommentiert sein.
Wenn Sie ähnlichen Code in Python schreiben, sieht er folgendermaßen aus.
msg = "Hello, Before World!"
def say(str = msg):
print(str)
say() #=> Hello, Before World!
msg = "Hello, After World!"
say() #=> Hello, Before World!
Der Code ist ähnlich, aber die Ausgabe der Funktion "say" hat sich geändert.
Haben Sie eine allgemeine Vorstellung vom Titel bekommen?
Erstens können sowohl Ruby als auch Python beliebige Ausdrücke in die Standardargumentwerte schreiben. Der Zeitpunkt, zu dem dieser Wert ausgewertet wird, unterscheidet sich also zwischen Ruby und Python.
In Ruby **, wenn eine Funktion aufgerufen wird **, In Python wird der Wert des Standardarguments ausgewertet, wenn ** die Funktion definiert ist **.
$msg = "Hello, Before World!"
def say(str = $msg)
puts str
end
say() #=> Hello, Before World!
$msg = "Hello, After World!"
say() #=>mit diesem Timing$msg wird ausgewertet
#=>Also, hallo, After World!
msg = "Hello, Before World!"
def say(str = msg): #An dieser Stelle wird msg Hallo ausgewertet, Before World!Es ist geworden
print(str)
say() #=> Hello, Before World!
msg = "Hello, After World!"
say() #=>Hallo, da der Wert von str bereits festgelegt wurde, Before World!
Das Ergebnis ist also das gleiche wie zuvor.
Persönlich denke ich, dass Ruby interessanter ist, weil es verschiedene Dinge tun kann, aber beide Verhaltensweisen sind * natürlich *, also nicht schlecht. (Ich frage mich, ob Python dies aufgrund der VM-Spezifikationen tun muss.)
Übrigens können Sie in Ruby auf andere Argumente als das Standardargument verweisen. Rufen Sie sich also innerhalb des Standardarguments auf und machen Sie es rekursiv.
#Schau, dieser Typ rekursiv mit den Standardargumenten ...
def fact(n,ret = n <= 1 ? 1 : fact(n-1) * n)
ret
end
puts fact(10) #=> 3628800
Sie können so etwas tun. Ruby ist ... (Entschuldigung).
Übrigens scheint Python diese Eigenschaft zu verwenden, um den lokalen Bereich (wahrscheinlich) zu ersetzen.
say_n = []
for i in range(0,10):
#say_n.append(lambda: print(i))
#Wenn ja, wird der Wert von i aktualisiert, so dass es nutzlos ist
say_n.append(lambda j = i: print(j))
#Ich muss binden, ich mag das
say_n[2]() #=> 2
say_n[4]() #=> 4
Es war ein sehr verschiedener Tipp, aber wenn Sie sich auf so kleine Unterschiede in den Spezifikationen für jede Sprache einlassen, werden Sie nicht leicht davon loskommen können, daher denke ich, dass es kein Verlust ist, dies zu wissen. Ich hoffe, Sie erinnern sich und finden etwas Nützliches.
Da sowohl Ruby als auch Python Außenseiter sind, kann es zu Fehlern kommen. Wenn Sie es finden, würde ich es begrüßen, wenn Sie Hatoo in den Kommentaren oder auf Twitter ([@ alucky0707]) sanft beißen könnten.