Ruby & Shyla sind zwei verdammt heiße Lesben
![](/file/d60c1bb5c376d01172b93.gif)
🛑 ALLE INFORMATIONEN KLICKEN HIER 👈🏻👈🏻👈🏻
Ruby & Shyla sind zwei verdammt heiße Lesben
aus Wikipedia, der freien Enzyklopädie
– Yukihiro Matsumoto : Vorwort des Sprachschöpfers in „Rubyプログラミング入門“ (übersetzt)
class TestKlasse
end
test_objekt = TestKlasse . new
puts 1 . class # => Integer
puts "text" . class # => String
puts test_objekt . class # => TestKlasse
puts TestKlasse . class # => Class
puts Class . class # => Class
# Definiere „Funktion“
def meine_funktion
puts "Hier bin ich"
end
# Kann in andern Objekten wie eine Funktion benutzt werden
class ABC
def gib_meine_funktion_aus
meine_funktion
end
end
mein_abc = ABC . new
mein_abc . gib_meine_funktion_aus # => Hier bin ich
mein_abc . meine_funktion # => Fehlermeldung, private method `meine_funktion' called
auto1 = Object . new
def auto1 . beschleunigen
puts "brumm brumm brumm"
end
auto1 . beschleunigen # => "brumm brumm brumm"
auto2 = auto1 . clone
def auto2 . bremsen
puts "quietsch"
end
auto2 . beschleunigen # => "brumm brumm brumm"
auto2 . bremsen # => "quietsch"
10 . times {
puts "Hallo Welt!"
}
10 . times do
puts "Hallo Welt!"
end
def methode_die_block_aufruft ( ü bergebener_parameter )
eigene_variable = "Hallo"
rückgabe = yield eigene_variable , ü bergebener_parameter
if rückgabe == "ok"
puts "☺"
end
end
# Aufruf
methode_die_block_aufruft ( "aus Ruby" ) do | p1 , p2 | # die Blockargumente werden innerhalb || in Block-lokale Variablen umgewandelt
puts p1 + " " + p2 + "!"
"ok"
end
# Zuerst wird im Block „Hallo aus Ruby!“ ausgegeben,
# dann in der Methode ☺, da der Rückgabewert „ok“ war
def mache_block_zu_proc & block
block # ist der Rückgabewert, da letzter Ausdruck
end
a = mache_block_zu_proc { | a , b | a + b }
b = proc { | a , b | a - b } # ein return innerhalb des Blocks verlässt die beinhaltende Methode, break nur den Block
c = lambda { | a , b | a * b } # wie proc, aber return innerhalb des lambdas verlässt nur diesen Block
d = -> ( a , b ) { a / b } # neue Schreibweise für lambda, runde Klammern sind optional
a . call ( 1 , 2 ) # => 3
b [ 1 , 2 ] # => -1
c . ( 1 , 2 ) # => 2
# Beispiel für funktionale Programmierung
e = d . curry . ( 8 ) # neues Proc das den (oder die) ersten Parameter (den Dividenden hier) als 8 setzt
e . ( 2 ) # => 4
# mit & können Proc-Objekte (eigentlich jede Klasse die eine call Methode hat) wieder in Blöcke umgewandelt werden
[ 8 , 4 , 2 , 1 ]. map ( & e ) # => [1, 2, 4, 8]
class Tier
def sagt
puts " #{ self . class } sagt nichts" # "text#{logik}text" ist Rubys Textinterpolation
end
end
module KannSchwimmen # Module, d.h. KannSchwimmen.new geht nicht
def schwimmt
puts " #{ self . class } schwimmt" # self gibt die Instanz zurück,
end # jedes Objekt hat eine Methode .class die das Klassenobjekt zurück gibt
end
module KannNichtSchwimmen
def schwimmt
puts " #{ self . class } geht unter"
end
end
class Fisch < Tier # Vererbung wird durch den Kleiner-Als-Operator gekennzeichnet
include KannSchwimmen # füge KannSchwimmen zwischen Fisch und Tier ein
end
class Vogel < Tier
include KannNichtSchwimmen
def sagt # übliches Vererben, überdecke sagt-Methode von Tier
puts " #{ self . class } : Piep"
end
end
class Mensch < Tier
include KannSchwimmen
def sagt
puts " #{ self . class } : Ich kann mich besser ausdrücken"
end
end
class NichtSchwimmer < Mensch
prepend KannNichtSchwimmen # hänge KannNichtSchwimmen vor NichtSchwimmer ein,
end # dh, überdecke die schwimmt-Methode
fisch = Fisch . new
mensch = Mensch . new
vogel = Vogel . new
nicht_schwimmer = NichtSchwimmer . new
fisch . sagt # => Fisch sagt nichts
vogel . sagt # => Vogel: Piep
mensch . sagt # => Mensch: Ich kann mich besser ausdrücken
nicht_schwimmer . sagt # => NichtSchwimmer: Ich kann mich besser ausdrücken
puts
fisch . schwimmt # => Fisch schwimmt
vogel . schwimmt # => Vogel geht unter
mensch . schwimmt # => Mensch schwimmt
nicht_schwimmer . schwimmt # => NichtSchwimmer geht unter
class Numeric # ruby-interne Klasse
def inverse # neue Methode, berechne den Kehrwert
1 . 0 / self
end
end
5 . inverse # => 0.2
FactoryBot . define do
factory :user do
first_name "Max"
last_name "Mustermann"
admin false
end
factory :admin , class : User do
first_name "Admin"
last_name "Root"
admin true
end
end
# summiere die zahlen 1 bis 100 (ohne Summenformel), reduce entspricht fold aus der funktionalen Programmierung
( 1 .. 100 ) . reduce { | counter , number | counter + number } # (1..100).sum geht auch
# Array aus den Zahlen von 0 bis 30 in 5er Schritten
( 0 .. 30 ) . step ( 5 ) . to_a
# Anzahl der Zeilen einer Datei die leer sind (ohne die Datei komplett in den Arbeitsspeicher zu laden)
IO . foreach ( "Dateiname" ) . count { | line | line =~ /^\s*$/ }
# Sortiere Array nach Länge der Nachnamen
[ "Max Mustermann" , "John Doe" , "Tarou Yamada" ]. sort_by { | name | name . split . last . length }
# Schreibe jedes dritte Wort im Satz in Großbuchstaben
"Franz jagt im komplett verwahrlosten Taxi quer durch Bayern." . split . each_slice ( 3 ) . map { | drei_wörter | drei_wörter . last . upcase! ; drei_wörter } . flatten . join ( " " )
class Object # Monkey-Patching aller Klassen
def self . getter * args # self ist hier Object, es wird eine Klassenmethode erzeugt
args . each do | arg | # es wird durch alle Parameter iteriert
define_method arg do # define_method(arg){block} erzeugt eine neue Methode des Namens arg mit dem Inhalt block
instance_variable_get ( "@ #{ arg } " . to_sym ) # instance_variable get gibt den Wert der Instanzvariablen des übergeben Namens zurück
end # \- "@#{arg}" hängt ein @ vor den Inhalt von arg, to_sym wandelt den String um in ein Symbol
end
end
def self . setter * args # *args packt alle Parameter in ein Array namens args
args . each do | arg |
define_method :" #{ arg } =" do | new_value | # define_method übergibt dem Block die übergeben Parameter
instance_variable_set ( "@ #{ arg } " . to_sym , new_value ) # \- setter-methoden enden mit einem =
end
end
end
end
class PaarMit2
def initialize links # Konstruktor
@links = links # Instanzvariblen werden bei Erwähnung in einer beliebigen Methode automatisch erzeugt
@rechts = 2
end
getter :links , :rechts
setter :links
end
paar = PaarMit2 . new ( 4 ) # new ruft immer den Konstruktor auf
paar . links # => 4
paar . rechts # => 2
paar . links = 9 # => 9
paar . links # => 9
paar . rechts = 8 # => Fehler: NoMethodError (undefined method `rechts=')
a = "ABC"
b = a . downcase
puts a , b # => ABC abc
a . downcase!
puts a , b # => abc abc
def gib_summe_aus arg1 , arg2
# Methodenlogik
unless arg1 . is_a? ( Numeric ) && arg2 . is_a? ( Numeric )
raise ArgumentError . new ( "Bitte nur Zahlen eingeben" ) # raise wirft Fehler
end
puts arg1 + arg2
rescue ArgumentError => e # Fange ArgumentError ab
puts "Es ist ein Fehler bei der Parameterübergabe aufgetreten"
rescue => e # Fange alle weiteren Fehler ab
puts e . message
ensure # wird auf jeden Fall ausgeführt
puts 'Methodenende'
end
a = 5
if a < 10 ; puts a ; end
puts a if a < 10 # Suffixform
unless a >= 10 ; puts a ; end # Invers
puts a unless a >= 10 # Invers + Suffixform
while a < 10 ; puts a ; a += 1 ; end
( puts a ; a += 1 ) while a < 20 # Suffixform
until a >= 30 ; puts a ; a += 1 ; end # Invers
( puts a ; a += 1 ) until a >= 40 # Invers + Suffixform
irb(main):001:0> ( 5 + 7 ) * 2
=> 24
irb(main):002:0> (( 5 + 7 ) * 2 ) . to_s . reverse
=> "42"
irb(main):003:0> "Ein Beispielstring" . size
=> 18
Normdaten (Sachbegriff): GND : 4653817-3 ( OGND , AKS )
Der Text ist unter der Lizenz „Creative Commons Attribution/Share Alike“ verfügbar; Informationen zu den Urhebern und zum Lizenzstatus eingebundener Mediendateien (etwa Bilder oder Videos) können im Regelfall durch Anklicken dieser abgerufen werden. Möglicherweise unterliegen die Inhalte jeweils zusätzlichen Bedingungen. Durch die Nutzung dieser Website erklären Sie sich mit den Nutzungsbedingungen und der Datenschutzrichtlinie einverstanden.
Wikipedia® ist eine eingetragene Marke der Wikimedia Foundation Inc.
Ruby (englisch für Rubin ) ist eine höhere Programmiersprache , die Mitte der 1990er Jahre vom Japaner Yukihiro Matsumoto entworfen wurde.
Ruby ist objektorientiert , unterstützt aber mehrere weitere Programmierparadigmen (unter anderem prozedurale und funktionale Programmierung sowie Nebenläufigkeit ), bietet dynamische Typisierung , Reflexion und automatische Speicherbereinigung . Ein Programm in Ruby wird zur Laufzeit interpretiert . 2012 wurde die Ruby-Spezifikation als internationale Norm ISO/IEC 30170 standardisiert. [4]
Yukihiro „Matz“ Matsumoto begann 1993 an einer eigenen Sprache zu arbeiten und gab am 21. Dezember 1995 die erste Version von Ruby, 0.95, frei. [5] Den Namen, hergeleitet vom Edelstein Rubin , wählte er als Anspielung auf die Programmiersprache Perl . [6] Matsumotos Ziel bei der Erschaffung der neuen Sprache war eine Synthese aus Elementen der von ihm geschätzten Programmiersprachen Perl , Smalltalk , Eiffel , Ada und Lisp zu bilden und funktionale und imperative Programmierparadigmen in Einklang zu bringen. Darüber hinaus sollte die Sprache objektorientierter als Python und zugleich mächtiger als Perl sein. Auch Flexibilität, Ausdrucksstärke und Einfachheit spielten bereits eine gewichtige Rolle. [7]
Besonders wichtig, neben den technischen Eigenschaften, war Matsumoto an Ruby auch die emotionale Wirkung auf Anwender, Mitentwickler und sich selbst. Matsumotos Auffassung dazu ist folgende:
„Natürlich unterscheidet sich Ruby von Perl oder Python an vielen Stellen, das ist schließlich Rubys Daseinsberechtigung. Rubys wesentliches Ziel ist „Freude“. Meines Wissens gibt es keine andere Sprache, die sich so sehr auf die Freude konzentriert. Rubys eigentliches Ziel ist es zu erfreuen – Sprachdesigner, Anwender, Sprachlerner, jeden. Freude allein ist jedoch nicht alles. Ruby bietet auch viele Verwendungsmöglichkeiten. Könnte man sie nicht einsetzen, würde sie doch auch keine Freude bereiten.“
In Japan erlangte Ruby nach Erscheinen rasch an Bekanntheit. Im Westen verhalfen der Programmiersprache das Buch Programming Ruby (2000) (bekannt als Pickaxe book als Anspielung auf die Illustration auf dem Buchdeckel) und das Webframework Ruby on Rails (2004) zum Durchbruch. In den folgenden Jahren mehrte sich auch die englisch- und deutschsprachige Dokumentation sowie Literatur. Die Verkehrssprache der Kern-Entwickler wechselte von Japanisch zu Englisch. Heute wird die Sprache als Open-Source -Projekt weitergepflegt und ist Gegenstand diverser Publikationen und Kurse. Veröffentlichungen mit neuen Funktionen geschehen üblicherweise im Jahresrhythmus zur Weihnachtszeit.
Ein Meilenstein in der Entwicklung von Ruby war die Version 1.9 im Jahr 2007, welche mit vielen Änderungen ziemlich inkompatibel zu den Vorgängerversionen wurde. Die Semantik einiger Konstrukte hat sich in dieser Version geändert. [8] Der Interpreter wurde komplett neu geschrieben, womit Rubyprogramme wesentlich schneller wurden. Zeichenketten bekamen separate Zeichenkodierungen , Variablen in Blöcken wurden block-lokal, IPv6 -Unterstützung und einige syntaktische Erleichterungen fanden Einzug.
Mit Ruby 2.0 wurden Schlüsselwortparameter eingeführt (bspw.: 0.step(by: 5, to: 20) ), das Vorhängen (prepend) von Modulen und Bedarfsauswertung (lazy-evaluation) von Iteratoren eingeführt. Außerdem wurde die Standardzeichenkodierung auf UTF-8 festgelegt. Ruby 2.1 führte Refinements (eine Methode um Überschreibungen von Klassen lokal zu beschränken) ein. In Ruby 2.2 wurde der vorhandene Garbage-Collector durch einen inkrementellen ersetzt. Mit Ruby 2.3 ist es möglich, alle Zeichenketten automatisch schreibgeschützt zu erstellen und ein neuer Operator &. (Safe-Navigation-Operator) zum Umgehen von Nil-Überprüfungen wurde eingeführt. In Ruby 2.4 wurden die Klassen Fixnum und Bignum vereinheitlicht. Seit Ruby 2.5 können Exceptions in do-end -Blöcken ohne separate Unterblöcke gefangen werden. Ruby 2.6 lieferte den ersten Code einens optionalen JIT-Compilers und fügte Bundler (s. u.) zur Standarddistribution hinzu. Ruby 2.7 führte ausführliches Pattermatching und einige syntaktische Erleichterungen dem Sprachkern hinzu. Jede neue Ruby-Version ab 1.9 brachte zudem Geschwindigkeitsoptimierungen verschiedenen Ausmaßes mit sich. Zusätzlich erweiterte jede Version die Standardbibliothek um nützliche Methoden. Es wurde stets auf Abwärtskompatibilität geachtet, allerdings nicht immer zu hundert Prozent erreicht.
Ruby 3.0, erschienen am 25. Dez. 2020, ist die erste Version, welche die „Ruby 3x3“ genannten Forderungen erfüllt: Dreimal höhere Ausführungsgeschwindigkeit zu Ruby 2.0 (durch JIT-Compiler), Nebenläufigkeit ohne GIL (allerdings noch experimentell) und statische Typanalyse (optional). Das eigentliche Update 3.0 stellt allerdings keinen größeren Sprung als die vorherigen jährlichen Veröffentlichungen dar und ist abwärtskompatibel zu Ruby 2.x.
Ruby ist eine Programmiersprache, die, obwohl sie auch viele andere Programmierparadigmen unterstützt, von Grund auf objektorientiert ist. Das bedeutet konkret, dass in Ruby ausnahmslos jeder Wert ein Objekt und jede Funktion eine Methode ist (d. h. einer Klasse zugeordnet ist). Ausnahmen für primitive Datentypen wie in vielen anderen objektorientierten Programmiersprachen gibt es nicht. Auch Klassen sind Objekte. Objekte speichern Instanzvariablen und haben eine Klasse. Klassen sind Objekte, die Methoden speichern und eine Vererbungshierarchie besitzen. Auf Instanzvariablen kann ausschließlich über Methoden zugegriffen werden.
Werden in Ruby „Funktionen“ definiert, so sind das in Wirklichkeit Methoden, die dem Objekt Object hinzugefügt werden. In Ruby erben alle Objekte implizit von Object , weswegen so definierte „Funktionen“ in jedem Objekt und damit allgegenwärtig verfügbar sind. Allerdings werden diese Funktionen als private markiert, das heißt, sie können nicht von außen auf einem Objekt aufgerufen werden.
Da in Ruby Objekte dynamisch sind, kann man mit Ruby auch prototypbasiert programmieren. Das bedeutet grob, dass Objekte eigene Methoden haben können (außerhalb der von der Klasse vorgegebenen) und kopiert und verändert werden können (da nur Klassen Methoden beinhalten können, wird im Hintergrund eine versteckte neue Klasse nur für das eine Objekt angelegt).
In den meisten höheren Programmiersprachen ist es möglich, Funktionen in irgendeiner Form zusätzlich als Parameter Logik zu übergeben, sei es durch First-Class-Funktionen oder First-Class-Objekte (deren Methoden dann die Logik bereitstellen). Das ist in Ruby nicht anders, allerdings hat Ruby den Spezialfall, dass genau eine Funktion übergeben wird, syntaktisch (und auch von der Rechenleistung) stark optimiert. Dieser Spezialfall wird Block genannt, gemeint als ein Block Programmierlogik, den die Funktion zu benutzen hat.
Blöcke werden Funktionen als separate Parameter übergeben und folgen als letztes Argument, eingegrenzt durch geschwungene Klammern oder die Schlüsselworte do und end . Im Folgenden wird die Methode times des Objekts 10 aufgerufen und ein Block übergeben. Beide Aufrufe sind identisch.
Zusätzlich können Blöcken Parameter übergeben werden und sie haben auch einen Rückgabewert. Zum Aufrufen des übergebenen Blocks wird innerhalb der aufgerufenen Methode das Schlüsselwort yield verwendet. Werden yield Parameter angegeben, so werden diese dem Block übergeben, der sie zu Beginn als lokale Variablen deklarieren oder ignorieren kann. Blöcke (ebenso wie Methoden) geben automatisch den letzten Ausdruck des Blockes als Rückgabewert zurück (mittels break und next kann aber auch an anderen Stellen zurückgesprungen werden).
Blöcke können auch in Funktionsobjekte umgewandelt werden. Wird innerhalb der Parameterliste einer Methode vor den letzten Parameter ein & geschrieben, wandelt Ruby den übergebenen Block in ein Proc (ein Funktions-Objekt) um. Alternativ können Procs auch manuell durch die Schlüsselworte proc , lambda und -> angelegt werden. Aufgerufen werde diese Objekte durch die Methoden call , [] oder .() . Da Ruby runde Klammern lediglich zum Gruppieren nutzt, können Procs nicht (wie in anderen Programmiersprachen üblich) mit proc_name() aufgerufen werden.
Alle Blöcke sind Closures , sie speichern also z. B. den Zustand lokaler Variablen, wenn sie innerhalb des Blocks dauerhaft benötigt werden.
Ruby beherrscht bewusst keine Mehrfachvererbung, bietet stattdessen aber ein Konzept namens Mixin (deutsch: Beimischung). Mixins sind Sammlungen von Methoden, die beliebigen Klassen beigemischt werden können. Eine Klasse kann beliebig viele Mixins beinhalten. Mixins werden in der Vererbungshierarchie zwischen Klasse und Superklasse in der Reihenfolge eingehängt, in der sie geschrieben wurden. Alternativ ist es auch möglich, Mixins vor die eigentliche Klasse zu hängen (u. a. hilfreich für Aspektorientierte Programmierung ). Um Mixins zu definieren, werden in Ruby Module benutzt, das sind quasi Klassen (d. h. Sammlungen von Methoden) die nicht instanziiert werden können und Namensräume in einem.
In Ruby sind alle Klassen offen, das heißt sämtliche Methoden können im späteren Programmverlauf ausgetauscht werden. Das gilt auch für alle ruby-internen Klassen. Um Methoden zu überschreiben, muss lediglich eine neue Klasse mit demselben Namen wie die zu überschreibende Klasse angelegt werden. Ruby tauscht dann die neu definierten Methoden aus oder fügt sie hinzu. Diese Technik ist sehr mächtig, ermöglicht aber auch schwer auffindbare Fehler, besonders in größeren Projekten. Aus diesem Grund wird sie auch leicht abwertend Monkey-Patching genannt. Etwas Abhilfe zu den auftretenden Problemen schaffen Refinements , eine Möglichkeit die Überschreibungen lokal einzuschränken. Die zuvor vorgestellte Methode, Module den gewünschten Klassen vorzuhängen (prepend) , ist meist die sichere Variante (und bietet außerdem die Möglichkeit die überdeckte Methode direkt aufzurufen).
Ruby wird gerne benutzt zum Erzeugen von domänenspezifischen Sprachen . Das sind Textbausteine, die weniger wie Programmcode aussehen, sondern mehr wie eine Auszeichnungssprache , in Wirklichkeit aber normaler Ruby-Code si
Arschfick auf Abruf Der versaute Kollegen Testen
Schlampe in voller interracial porno-Szene
Jungs züchteten lockiges Küken für die doppelte Penetration