[RUBY] Eine Warnung wird angezeigt, wenn versucht wird, eine große Ganzzahl mit den speziellen Variablen $ 1, $ 2, $ 3 ... zu verwenden.

Ruby hat spezielle Variablen "$ 1, $ 2, $ 3 ...", und "$ n" wird der Wert zugewiesen, der mit der n-ten Klammer in der letzten erfolgreichen Musterübereinstimmung übereinstimmt.

"abc" =~ /(.)(.)(.)/
p $1 #=> "a"
p $2 #=> "b"
p $3 #=> "c"

Rurima vom 26. September 2020

Nummer n Sie können eine beliebige Anzahl großer positiver Ganzzahlen verwenden.

Es heißt, aber in Wirklichkeit wird eine Warnung angezeigt, wenn ich versuche, einen großen Wert zu verwenden (ich habe es beim Spielen bemerkt).

$ ruby -e '$9999999999999999'
-e:1: warning: `$9999999999999999' is too big for a number variable, always nil

In diesem Fall frage ich mich, wie viel Wert als n von $ n verwendet werden kann. Wenn ich ihn also mit dem folgenden Code unter Verwendung einer einfachen Zweiteilung nachgeschlagen habe, scheint der Maximalwert in meiner Umgebung 1073741823 zu sein. tat.

require 'stringio'

ok = 0
ng = 10**10

while (ok-ng).abs > 1
  io = StringIO.new
  $stderr = io

  mi = (ok+ng)/2
  eval("$#{mi}")
  if io.size == 0
    ok = mi
  else
    ng = mi
  end

  $stderr = STDERR
end

p ok #=> 1073741823

Selbst wenn Sie es mit einer anderen Methode überprüfen, werden Sie anscheinend gewarnt, wenn "$ 1073741823" das Maximum ist und der Wert größer ist. Der Wert 1073741823 scheint jedoch umgebungsabhängig zu sein. Je nach Umgebung können Sie möglicherweise einen größeren Wert verwenden oder eine Warnung mit einem kleineren Wert erhalten.

$ ruby -e '$1073741823' 
#=>Nichts passiert

$ ruby -e '$1073741824'
#=>Warnung wird ausgegeben
#=> -e:1: warning: `$1073741824' is too big for a number variable, always nil

Die offensichtliche Frage ist, was passiert, wenn das Match mit einem regulären Ausdruck erfolgreich ist, der mehr als 1073741823 erfasst, aber das ist in Ordnung. Ruby hat eine maximale Anzahl von Erfassungen von 32767, und reguläre Ausdrücke, die diese Grenze überschreiten, können nicht kompiliert werden.

$ ruby -e 'Regexp.compile("(.)"*32767)' 
#=>Nichts passiert

$ ruby -e 'Regexp.compile("(.)"*32768)'
#=>RegexpError tritt auf. Die Nachricht lautet wie folgt
#=> `initialize': too many capture groups are specified:

Ich habe mit einem einfachen Skript unter Verwendung der folgenden Dichotomie einen Wert von 32767 gefunden, aber wenn ich mir den Quellcode von Onikumo, der Ruby-Engine für reguläre Ausdrücke, ansehe, sehe ich die Obergrenze der Anzahl der Erfassungen ONIG_MAX_CAPTURE_GROUP_NUM. Es gibt eine Variable zu zeigen, die 32767 zu sein scheint. , dann der Maximalwert auf der Seite der speziellen Variablen $ 1, $ 2, $ 3 ... Ich fühle mich wie es 32767 sein kann (´ ・ ω ・ `)

ok = 0
ng = 10**8

while (ok-ng).abs > 1
  mi = (ok+ng)/2
  begin
    Regexp.compile("(.)"*mi)
    ok = mi
  rescue RegexpError => e
    ng = mi
  end
end

p ok #=> 32767

** Umweltinformationen **

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

Recommended Posts

Eine Warnung wird angezeigt, wenn versucht wird, eine große Ganzzahl mit den speziellen Variablen $ 1, $ 2, $ 3 ... zu verwenden.
[Schienen] Was tun, wenn die Ansicht zusammenbricht, wenn eine Nachricht mit der Fehlermethode angezeigt wird?
[WSL] Lösung für das Phänomen, dass 404 angezeigt wird, wenn versucht wird, Java mit apt einzufügen (persönliches Memo)
Ein problematischer Hinweis beim Versuch, nginx mit Remote-Containern von vscode zu verwenden
Auf Anforderung wird der Zugriff auf die Ressource beim Push mit Docker verweigert
[Ruby] Dies ist die Lösung. Wann sollte ich Instanzvariablen verwenden?
Beim Versuch, PowerMock mit JUnit zu verwenden, wurde ein IllegalAccessError angezeigt
Als ich versuchte, das AWS SDK mit Ruby + Lambda zu verwenden, war "sam local" durcheinander.
Was tun, wenn javax.el.ELException: Kein gültiger Methodenausdruck: wird angezeigt, wenn der JSF-Bildschirm angezeigt wird
Was tun, wenn der Vorgang nicht zulässig ist, wenn ein Befehl im Terminal ausgeführt wird?
[IOS] Was tun, wenn das Bild mit einer Farbe gefüllt ist?
[Java small story] Überwachen Sie, wann der Liste ein Wert hinzugefügt wird
Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln
Möglichkeit bei der Bereitstellung auf EC2, aber im Fehlerprotokoll wird nichts angezeigt
Was zu tun ist, wenn es ungültig ist, weil es nicht mit einem '-' beginnt
So lösen Sie, wenn Sie mit einem neuen Container keine Verbindung zur Datenbank herstellen können, weil der Port dem vorhandenen Docker-Container zugewiesen ist
Turbolinks: Ich möchte das Problem lösen, dass JS nicht richtig angezeigt wird, es sei denn, es wird beim Übergang mit link_to neu geladen
Wenn das Projekt nicht in Eclipse angezeigt wird
Eine Geschichte über die Erstellung von PKIX-Pfaden schlug fehl, als versucht wurde, mit Jenkins eine Tomcat-Bereitstellung durchzuführen
Beim Importieren von CSV mit Rails war es wirklich einfach, den Befehl nkf zu verwenden
Was ist zu tun, wenn in Eclipse "Fehler beim Laden der gemeinsam genutzten JNI-Bibliothek" angezeigt wird?
Vorläufiges Memo beim Erstellen der CentOS 6-Serie mit VirtualBox
Was tun, wenn die bereits verwendete Adresse nach dem Ausführen der Schienen angezeigt wird?
Beim Hochladen einer Datei mit Spring Boot wird eine Fehlerbehandlung durchgeführt, wenn die maximale Dateigröße überschritten wird.
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
Ein Memorandum beim Versuch von Spring Data JPA mit STS
Berücksichtigung des in SpringToolSuite (STS) verwendeten Eigenschaftseditors
Ein Memorandum beim Versuch, eine GUI mit JavaFX zu erstellen
Eine Geschichte über den Versuch, mit Mockito auszukommen
Hinweise zur Überprüfung bei der Verwendung von Lombok
So führen Sie einen bestimmten Vorgang aus, wenn die Zurück-Taste im Android-Fragment gedrückt wird
Wenn eine mit dem Atom-Editor erstellte Java-Datei bei der Ausführung an der Eingabeaufforderung verstümmelt wird
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
wsimport-Fehlerbehandlung (Eine Klasse / Schnittstelle mit dem gleichen Namen "xxx" wird bereits verwendet)