[ruby-de] array - position eines Matches

Martin J. Dürst duerst at it.aoyama.ac.jp
Mo Mai 22 19:06:27 JST 2017


On 2017/05/22 18:03, Die Optimisten wrote:
> On 2017-05-22 08:22, Robert Klemme wrote:
>> 2017-05-21 22:49 GMT+02:00 Die Optimisten <inform at die-optimisten.net>:
>>> On 2017-05-20 12:06, Robert Klemme wrote:
>>>> 2017-05-20 0:07 GMT+02:00 Die Optimisten <inform at die-optimisten.net>:
>>>>
>>>>> wie bekomme ich die Array-Position eines Matches?
>>>>>
>>>>> arr=['abc', 'def']
>>>>> arr.index /b/        # => 0 --- geht nur leider nicht!
>>>> Lies doch endlich mal die Dokumentation!
>>>> http://ruby-doc.org/core-2.4.1/Array.html#method-i-index
>>> Eben deshalb stelle ich die Frage hier; es gibt keine (direkte) Methode
>>> dazu:
>> Was soll jetzt wieder "direkt" bedeuten? Du hast danach gefragt, wie
>> man den Index eines Treffers bekommt und die Dokumentation hat die
>> Antwort dazu.
>>
>>> (Nicht: arr.index 'abc', sondern /b/)
>>> Geht also nur manuell mit Block.
>> Was soll da manuell sein? Manuell ist, wenn man selbst die Indices
>> zählen muss.
>>
>>> Hätte ja sein können, daß es dazu eine
>>> Funktion gäbe (zB .find_index != .index wäre...)
>>> Bei vielen anderen Methoden ist string und Regex - Eingabe möglich
>>> (analog
>>> zur String-Klasse)
>> Was meinst Du? Welche "vielen Methoden" gibt es denn Deiner Ansicht nach?
>>
>> Ciao
>>
>> robert
>>
> Hallo
> Aus den Möglichkeiten von String.index "str" UND  /re/ hätte ich
> geschlossen, daß dies bei Arrays analog wäre.

Bei String ist das schon so. Aber Arrays können irgendwelche objekte 
enthalten, desshalb macht es nicht Sinn, der Suche mit regulären 
Ausdrücken eine besondere Bedeutung zu geben. Das folgende aber 
funktioniert:

irb(main):005:0> a = ['abc', 'def', 123, 456, /bcd/]
=> ["abc", "def", 123, 456, /bcd/]
irb(main):006:0> a.index /bcd/
=> 4

Auch wenn man mit einer Zeichenkette in einem Array sucht, findet man 
nur Zeichenketten, die exakt gleich sind, nicht Substrings:

irb(main):007:0> a.index 'a'
=> nil
irb(main):008:0> a.index 'abc'
=> 0


> (least surprise)  Das ist was ich meinte - obs noch eine "direkte"
> Methode gäbe, die ich übersehen hätte.

Man könnte sich vorstellen, das eine Methode 
Array#index_with_case_equality in gewissen Fällen praktisch sein könnte.

Das wäre wie folgt definiert:

class Array
   # Name dürfte noch etwas kürzer sein :-(
   def index_with_case_equality (obj)
     index { |item| obj === item }
   end
end

Ich mir bin aber nicht sicher, ob die Methode so oft gebraucht würde.

> Ich weiß nicht, wo es mir sonst untergekommen ist, gefühlt kann man in
> den meisten Fällen strings und regex ersatzweise verwenden.

Bei String-Methoden meist schon. Bei Array-Methoden nicht.

> PS: das {|x,y| } geht mir auf den Geist, wohl auch weil die DE-Tastatur
> dafür ungeeignet ist. Leider kann man das nicht durch begin |x| ... end

Nicht begin |x| ... end, aber do |x| ... end (in den meisten Fällen).

> ersetzen. Läßt sich das irgendwie umdefinieren (im Syntaxbaum, wie auch
> immer das geht) ?

Grüße,   Martin.




Mehr Informationen über die Mailingliste ruby-de