110 Stimmen

Was bedeutet << in Ruby?

Ich habe einen Code:

  def make_all_thumbs(source)
    sizes = ['1000','1100','1200','800','600']
    threads = []
    sizes.each do |s|
      threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }
    end
  end

Was bedeutet << bedeuten?

196voto

emboss Punkte 37771

Er kann 3 verschiedene Bedeutungen haben:

'<<' als gewöhnliche Methode

In den meisten Fällen ist '<<' eine Methode, die wie die anderen definiert ist, in Ihrem Fall bedeutet es "an das Ende dieses Arrays anhängen" (siehe auch aquí ).

Das ist Ihr spezieller Fall, aber es gibt auch viele andere Gelegenheiten, bei denen Sie auf die Methode "<<" stoßen werden. Ich werde sie nicht als "Operator" bezeichnen, da es sich in Wirklichkeit um eine Methode handelt, die für ein Objekt definiert ist, das von Ihnen überschrieben oder für Ihre eigenen Objekte implementiert werden kann. Andere Fälle von "<<

  • String-Verkettung: "a" << "b"
  • Schreiben der Ausgabe in ein IO: io << "Eine Textzeile \n "
  • Schreiben von Daten in einen Message Digest, HMAC oder Cipher: sha << "Zu hashender Text"
  • Linksverschiebung einer OpenSSL::BN: bn << 2
  • ...

Definition der Singleton-Klasse

Dann gibt es noch die mysteriöse Verschiebung des aktuellen Geltungsbereichs (= Wechsel des Selbst) innerhalb des Programmablaufs:

class A
  class << self
    puts self # self is the singleton class of A
  end
end

a = A.new
class << a
  puts self # now it's the singleton class of object a
end

Das Geheimnis class << self hat mich dazu veranlasst, mich mit den Interna zu befassen. Während in allen von mir erwähnten Beispielen << ist eigentlich eine Methode, die in einer Klasse definiert ist, d.h.

obj << stuff

ist gleichbedeutend mit

obj.<<(stuff)

die class << self (oder jedes andere Objekt anstelle des Selbst) ist wirklich anders. Es ist wirklich eine eingebaute Funktion der Sprache selbst, in CRuby ist es definiert in zerlegen.y als

k_class tLSHFT expr

k_class ist das Schlüsselwort "class", wobei tLSHFT ist ein '<<'-Zeichen und expr ist ein beliebiger Ausdruck. Das heißt, Sie können tatsächlich schreiben

class << <any expression>

und erhalten verlagert in die Singleton-Klasse des Ergebnisses des Ausdrucks. Die tLSHFT Sequenz wird als 'NODE_SCLASS'-Ausdruck geparst, der als Definition der Singleton-Klasse (vgl. node.c)

case NODE_SCLASS:
    ANN("singleton class definition");
    ANN("format: class << [nd_recv]; [nd_body]; end");
    ANN("example: class << obj; ..; end");
    F_NODE(nd_recv, "receiver");
    LAST_NODE;
    F_NODE(nd_body, "singleton class definition");
    break; 

Hier Dokumente

Hier Dokumente verwenden '<<' auf eine Weise, die wiederum völlig anders ist. Sie können eine Zeichenkette, die sich über mehrere Zeilen erstreckt, bequem durch die Deklaration

here_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_

Um den "here doc operator" zu unterscheiden, muss ein beliebiges String-Begrenzungszeichen unmittelbar auf das "<<" folgen. Alles, was zwischen diesem ersten Begrenzungszeichen und dem zweiten Vorkommen desselben Begrenzungszeichens liegt, wird Teil der endgültigen Zeichenkette sein. Es ist auch möglich, '<<-' zu verwenden, mit dem Unterschied, dass bei der Verwendung des letzteren jedes führende oder nachfolgende Leerzeichen ignoriert wird.

35voto

shajin Punkte 3112

Wird meist in Arrays verwendet, um den Wert an das Ende des Arrays anzuhängen.

a = ["orange"]
a << "apple"
puts a

gibt dies

  \["orange", "apple"\] Ergebnis.

10voto

Aditya Mukherji Punkte 8875

A << b' bedeutet, b an das Ende von a anzuhängen

7voto

Emiliano Poggi Punkte 23692

Es ist der Betreiber, der es Ihnen ermöglicht, die bestehende Arrays, durch anhängend neue Artikel.

Im obigen Beispiel füllen Sie nur das leere Array auf threads mit 5 neuen Themen.

7voto

Jesus Gonzalez Punkte 117

In Ruby gibt es immer mehr als eine Möglichkeit, etwas zu tun. So hat Ruby einige nette Abkürzungen für gängige Methodennamen. wie diese hier für .push, anstatt den .push-Methodennamen einzutippen, kann man einfach <<, den Verkettungsoperator, verwenden. tatsächlich kann man in einigen Fällen jede dieser Möglichkeiten für die gleiche Operation verwenden .push und + mit <<.

Wie Sie in diesem Beispiel sehen können:

alphabet = ["a", "b", "c"]
alphabet << "d" # Update me!
alphabet.push("e") # Update me!
print alphabet 
caption = "the boy is surrounded by "
caption << "weezards!" # Me, too!
caption += " and more. " # Me, too!
# .push can no be uses for concatenate 
print caption

Sie sehen also, das Ergebnis ist:

["a", "b", "c", "d", "e"]
the boy is surrounded by weezards! and more.

können Sie den Operator << verwenden, um ein Element in ein Array zu schieben oder eine Zeichenkette mit einer anderen zu verketten.

Dies bedeutet also, dass ein neues Element/Objekt vom Typ Thread erstellt und in das Array verschoben wird.

 threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X