Diverser Syntax

Ausdruck beenden

Ruby verwendet einen Zeilenumbruch als Ende eines Ausdrucks. Wenn eine Zeile mit einem Operator, einer offenen Klammer, einem Komma usw. endet, wird der Ausdruck fortgesetzt.

Sie können einen Ausdruck mit einem ; (Semikolon) beenden. Semikolons werden am häufigsten mit ruby -e verwendet.

Einrückung

Ruby erfordert keine Einrückung. Typischerweise werden Ruby-Programme um zwei Leerzeichen eingerückt.

Wenn Sie Ruby mit aktivierten Warnungen ausführen und eine Einrückungs-Diskrepanz feststellen, erhalten Sie eine Warnung.

alias

Das Schlüsselwort alias wird am häufigsten zum Aliasing von Methoden verwendet. Beim Aliasing einer Methode können Sie entweder deren Namen oder ein Symbol verwenden.

alias new_name old_name
alias :new_name :old_name

Für Methoden kann oft Module#alias_method anstelle von alias verwendet werden.

Sie können alias auch zum Aliasing von globalen Variablen verwenden

$old = 0

alias $new $old

p $new # prints 0

Sie können alias in jedem Geltungsbereich verwenden.

undef

Das Schlüsselwort undef verhindert, dass die aktuelle Klasse auf Aufrufe der benannten Methoden reagiert.

undef my_method

Sie können Symbole anstelle von Methodennamen verwenden

undef :my_method

Sie können mehrere Methoden undefinieren

undef method1, method2

Sie können undef in jedem Geltungsbereich verwenden. Siehe auch Module#undef_method

defined?

defined? ist ein Schlüsselwort, das einen String zurückgibt, der sein Argument beschreibt

p defined?(UNDEFINED_CONSTANT) # prints nil
p defined?(RUBY_VERSION)       # prints "constant"
p defined?(1 + 1)              # prints "method"

Sie müssen keine Klammern bei defined? verwenden, aber sie werden aufgrund der niedrigen Präzedenz von defined? empfohlen.

Wenn Sie beispielsweise prüfen möchten, ob eine Instanzvariable vorhanden ist und ob die Instanzvariable Null ist

defined? @instance_variable && @instance_variable.zero?

Dies gibt "expression" zurück, was nicht das ist, was Sie wollen, wenn die Instanzvariable nicht definiert ist.

@instance_variable = 1
defined?(@instance_variable) && @instance_variable.zero?

Das Hinzufügen von Klammern bei der Prüfung, ob die Instanzvariable definiert ist, ist eine bessere Prüfung. Dies gibt korrekt nil zurück, wenn die Instanzvariable nicht definiert ist, und false, wenn die Instanzvariable nicht Null ist.

Die Verwendung spezifischer Reflexionsmethoden wie instance_variable_defined? für Instanzvariablen oder const_defined? für Konstanten ist weniger fehleranfällig als die Verwendung von defined?.

defined? behandelt einige reguläre globale Variablen speziell, basierend darauf, ob ein aktiver regulärer Ausdruckstreffer vorhanden ist und wie viele Erfassungsgruppen es gibt

/b/ =~ 'a'
defined?($~) # => "global-variable"
defined?($&) # => nil
defined?($`) # => nil
defined?($') # => nil
defined?($+) # => nil
defined?($1) # => nil
defined?($2) # => nil

/./ =~ 'a'
defined?($~) # => "global-variable"
defined?($&) # => "global-variable"
defined?($`) # => "global-variable"
defined?($') # => "global-variable"
defined?($+) # => nil
defined?($1) # => nil
defined?($2) # => nil

/(.)/ =~ 'a'
defined?($~) # => "global-variable"
defined?($&) # => "global-variable"
defined?($`) # => "global-variable"
defined?($') # => "global-variable"
defined?($+) # => "global-variable"
defined?($1) # => "global-variable"
defined?($2) # => nil

BEGIN und END

BEGIN definiert einen Block, der ausgeführt wird, bevor irgendein anderer Code in der aktuellen Datei ausgeführt wird. Es wird typischerweise in One-Linern mit ruby -e verwendet. Ebenso definiert END einen Block, der ausgeführt wird, nachdem irgendein anderer Code ausgeführt wurde.

BEGIN muss auf oberster Ebene erscheinen und END gibt eine Warnung aus, wenn Sie es innerhalb einer Methode verwenden.

Hier ist ein Beispiel

BEGIN {
  count = 0
}

Sie müssen { und } verwenden, Sie dürfen nicht do und end verwenden.

Hier ist ein Beispiel für einen One-Liner, der Zahlen aus der Standardeingabe oder beliebigen Dateien in der Argumentenliste addiert

ruby -ne 'BEGIN { count = 0 }; END { puts count }; count += gets.to_i'