senäh

17senäh und so…

Rails
14. Jan 2013
Kommentare: 2

Ruby-Basics: Defined, Encoding, Strings in Strings, mehrere return Werte und Array Goodies

Kategorien: Rails | 14. Jan 2013 | Kommentare: 2

So ein Blog ist auch immer ein Stück weit Hirnauslagerung. Man kann Probleme, die man ständig aufs Neue nachschlagen muss, bis Routine reinkommt, immer und immer wieder googlen. Man kann aber auch ein paar dieser Probleme in seinen Blog schreiben. Beim nächsten Mal weiß man eher wo man suchen muss. Außerdem: schon meine Englisch-Lehrerin hat gesagt, um Sachen zu lernen, muss man sie lesen, schreiben und laut aufsagen. Wichtig ist vor allem der letzte Teil 😉

Ich hoffe, ich helfe einigen von euch bei der Suche oder ihr stoßt hier sogar auf Lösungen, deren Probleme ihr erst noch haben werdet.

Existiert Variable x?

defined?(@var_to_check).nil?
# => true
(@var_to_check ||= nil).nil?
# => true

UTF-8-Issues beim Verarbeiten von User-Input

some_file.rb:17:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)

Bekannter Fehler? Dann zuerst #encoding: UTF–8 an den Anfang des Dokuments setzen. Anschließend so etwas in der Art:

# simple
utf8_str = input.force_encoding("utf-8")

# extented
utf8_str = input.force_encoding("ISO-8859-1").encode("utf-8", replace: nil)

Hier gefunden.

Vorkommen von Strings in Strings

0-basierte Position des ersten Vorkommens

"senaeh" =~ /ae/
# => 3

"senaeh" =~ /y/
# => nil

Auf regulären Ausdruck prüfen

"senaeh" =~ /ae/ ? "kommt vor" : "kommt nicht vor"
# => "kommt vor"

Anzahl bestimmter Zeichen

"senaeh".count("ae")
# => 3

Der Parameter der count-Methode ist quasi equivalent zum regulären Ausdruck /[ae]+/, durchsucht also lediglich nach Übereinstimmungen der Zeichenmenge. Zur Illustration:

"senaeh".count("a-z")
# => 6

Anzahl genauer Übereinstimmungen

"senaeh".scan("ae")
# => ["ae"] 
"senaeh".scan("ae").count
# => 1

"senaeh".scan(/[sa]e/)
# => ["se", "ae"] 
"senaeh".scan(/[sa]e/).count
# => 2

Der Unterschied zwischen count und scan wird hier deutlich.

Erste Übereinstimmung

xml_str = "<item id='17' />"
item_id = xml_str[/\d+/]
# => "17"

Gems global installieren

Das kann sinnvoll sein für System Services, Automator Workflows und andere Anwendungen, die auf das globale System-Ruby zugreifen.

sudo gem install json --instal-dir /Users/Enno/.rvm/gems/ruby-1.9.3-p194@global

Mehrere return-Werte

Für so etwas liebe ich Ruby.

def gimme_two
  return "one", "two"
end

val_1, val_2 = gimme_two
# => ["one", "two"] 

val_1
# => "one" 

val_2
# => "two"

RubyMine-Fan? Dann hier mal etwas zum Refactoring bei mehreren Rückgabewerten.

Längstes Wort in einem Array finden

["pipo", "enno", "senaeh"].group_by(&:length)
# => {4=>["pipo", "enno"], 6=>["senaeh"]} 
["pipo", "enno", "senaeh"].group_by(&:length).max
# => [6, ["senaeh"]] 
["pipo", "enno", "senaeh"].group_by(&:length).max.last
# => ["senaeh"] 
["pipo", "enno", "senaeh"].group_by(&:length).max.last.first
# => "senaeh"

# oder ein bisschen kürzer
["pipo", "enno", "senaeh"].group_by(&:length).max[1][0]
# => "senaeh"

# und wenn wir schon mal dabei sind: die Maximallänge
["pipo", "enno", "senaeh"].group_by(&:length).max.first
# => 6

Array-Elemente zu String verbinden bzw. String in Array teilen

['veni', 'vidi', 'vici'].join(', ')
# => "veni, vidi, vici"
['veni', 'vidi', 'vici'] * ', '
# => "veni, vidi, vici"

# und rückwärts
'veni, vidi, vici'.split(', ')
# => "veni, vidi, vici"

Schön, dass es Seiten gibt, die den Umstieg von PHP auf Ruby erleichtern 🙂

More to come

Da ich selbst erst mit Ruby bzw. Rails angefangen habe, wird es Braindumps dieser Art regelmäßig geben. Vielleicht helfen sie ja dem ein oder anderen, egal ob neues Wissen oder Auffrischung des Bisherigen.

Wer für das jeweilige Problem bessere Alternativen hat: immer her damit 🙂

Autor: Enno

Ich bin Enno. PHP ist mein Ding, aber auch alles Neue rund um die Themen HTML5, CSS3 & Co finde ich interessant. Ich mag es Leuten zu helfen und mein Wissen weiterzugeben. Sollte dir mein Beitrag gefallen haben, lass doch nen Kommentar da oder benutze einen der Social Buttons, um deinen Dank auszudrücken ;)