Hogyan működik a [szögletes zárójel] módszer meghatározása a Ruby-ban?

Translate

ÁtélemProgramozás Ruby - egy gyakorlati programozói útmutatóés belebotlottam ebbe a kódrészletbe:

class SongList
  def [](key)
    if key.kind_of?(Integer)
      return @songs[key]
    else
      for i in [email protected]
        return @songs[i] if key == @songs[i].name
      end
    end
    return nil
  end
end

Nem értem, hogy működik a [] módszer meghatározása?

Miért van a kulcs a [] -on kívül, de ha a metódust meghívják, a [] -en belül van?

Lehet kulcs zárójel nélkül?

Tudomásul veszem, hogy léteznek sokkal jobb módszerek ennek megírására, és tudom, hogyan kell megírni a saját módszeremet, ami működik, de ez a [] módszer csak zavarba ejt ... Bármilyen segítséget nagyra értékelünk, köszönöm

This question and all comments follow the "Attribution Required."

Minden válasz

Translate

A rubinban használt módszerek sok nyelvtől eltérően tartalmazhatnak speciális karaktereket. Az egyik a tömb keresési szintaxisa.

Ha saját hash osztályt vezetne be, ahol egy elem kivonásakor a hashban meg akarja fordítani, akkor a következőket teheti:

class SillyHash < Hash

  def [](key)
    super.reverse
  end

end

Ezt bebizonyíthatja egy kivonat meghívásával az alábbiak szerint:

a = {:foo => "bar"}
 => {:foo=>"bar"} 
a.[](:foo)
 => "bar" 
a.send(:[], :foo)
 => "bar" 

Tehát a def [] meghatározta azt a módszert, amelyet akkor használmy_array["key"]Egyéb módszerek, amelyek furcsának tűnhetnek számodra:

class SillyHash < Hash

  def [](key)
    super.reverse
  end

  def []=(key, value)
    #do something
  end

  def some_value=(value)
    #do something
  end

  def is_valid?(value)
    #some boolean expression
  end

end

Csak tisztázandó, az a definíciója[]A módszer nem kapcsolódik tömbökhöz vagy hashekhez. Vegyük a következő (mesterkélt) példát:

class B
  def []
    "foo"
  end
end

 B.new[]
 => "foo" 
Forrás
Translate

Ez csak szintaktikus cukor. Vannak bizonyos szintaxis minták, amelyeket lefordítanak üzenetek küldésére. Különösen

a + b

ugyanaz mint

a.+(b)

és ugyanez vonatkozik a==, !=, <, >, <=, >=, <=>, ===, &, |, *, /, -, %, **, >>, <<, !==, =~és!~is.

Szintén,

!a

ugyanaz mint

a.!

és ugyanez vonatkozik a~.

Akkor,

+a

ugyanaz mint

[email protected]

és ugyanez vonatkozik a-.

Plusz,

a.(b)

ugyanaz mint

a.call(b)

Van egy speciális szintaxis a beállítók számára is:

a.foo = b

ugyanaz mint

a.foo=(b)

Végül, de nem utolsósorban, van egy speciális szintaxis az indexeléshez:

a[b]

ugyanaz mint

a.[](b)

és

a[b] = c

ugyanaz mint

a.[]=(b, c)
Forrás
Translate

a szögletes zárójelben szerepel a módszer neveArray#sizeneked vanArray#[]módszerként, és akár bármely más módszerhez hasonlóan használhatja:

array = [ 'a', 'b', 'c']
array.[](0) #=> 'a'
array.[] 1  #=> 'b'
array[2]    #=> 'c'

az utolsó valami szintaktikus cukorhoz hasonló, és pontosan ugyanazt csinálja, mint az első. AArray#+hasonlóan működik:

array1 = [ 'a', 'b' ]
array2 = [ 'c', 'd' ]
array1.+(array2) #=> [ 'a', 'b', 'c', 'd' ]
array1.+ array2  #=> [ 'a', 'b', 'c', 'd' ]
array1 + array2  #=> [ 'a', 'b', 'c', 'd' ]

Akár ehhez hasonló számokat is hozzáadhat:

1.+(1) #=> 2
1.+ 1  #=> 2
1 + 1  #=> 2

ugyanaz működik/, *, -és még sok más.

Forrás
Translate

Ez egy operátortúlterhelő, felülírja vagy kiegészíti egy módszer viselkedését az Ön által definiált osztályon belül, vagy egy olyan osztályt, amelynek viselkedését módosítja. Megteheti a [] -tól eltérő operátorokkal is. Ebben az esetben módosítja a [] viselkedését, amikor a SongList osztály bármely példányára meghívják.

Ha megvan a songlist = SongList.new fájl, és utána megcsinálod a ["foobar"] dallistát, akkor az egyedi defed működésbe lép, és feltételezi, hogy a "foobar" paramétert (kulcsot) kell átadni, és a "foobar" -ra "bármit is mondjon a módszer, meg kell tenni a kulcshoz.

Próbáld ki

class Overruler
    def [] (input)
          if input.instance_of?(String)
            puts "string"
          else
            puts "not string"
          end
     end
end
foo = Overruler.new
foo["bar"].inspect
foo[1].inspect
Forrás
Leave a Reply
You must be logged in to post a answer.
A szerzőről