Ruby - include?

Napokban sikerült belefutni egy érdekességbe amitől most kicsit felment az agyvizem:

# irb
irb(main):001:0> "wwwroot".include? "www"
=> true
irb(main):002:0> ["wwwroot"].include? "www"
=> false

Akinek esetleg nem lenne világos: String object esetén az include teljesen másként viselkedik, mint Array object esetén: Stringnél részleges egyezést néz, tömbnél teljes egyezést. WAT

És ezt a dokumentáció is így közli:

https://ruby-doc.org/core-2.2.0/String.html#method-i-include-3F
include? other_str → true or false
Returns true if str contains the given string or character.

https://ruby-doc.org/core-2.2.0/Array.html#method-i-include-3F
include?(object) → true or false
Returns true if the given object is present in self (that is, if any element == object), otherwise returns false.

Így várjon az ember konzisztenciát..

Hozzászólások

Hat nekem pedig pont igy logikus. Mert egy string meg felfoghato ugy, mint karakterekbol allo array.

Nem látom a problémát. Stringben nyilván töredékre érdemes keresni, tömbben meg elemre (pontos egyezés).

+1

Máshol is így szokás.


➜ ~ python
Python 2.7.13 (default, Dec 18 2016, 07:03:39)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> "www" in "wwwroot"
True
>>> "www" in ["wwwroot"]
False
>>>

Hmm.. Mondjuk python-ba ebbe még nem sikerült belefussak.
Ettől függetlenül úgy látszik a hiba bennem van, mert elvárnám, hogy ugyan az a funkció hasonló képen működjön mindenféle objektumra (tiszta SAP-s érzés, ahol egyik modul alatt az F1 a helpet adta, másik alatt meg kilépett a modulból)
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

Az lehet felrevezeto, a megszokottol eltero, hogy Rubyban a String az nem karakter tomb. Lehet indexelni, de nem Enumerable mint a tomb. Van viszont az each_char ami Enumerator-t ad vissza. Az Enumerable-en levo include? amit a tomb es egyeb felsorolhato dologok orokolnek mas mint a String#include?. A hiba inkabb a nevben van jobb lett volna #include? helyett #substring?.

"ugyan az a funkció hasonló képen működjön mindenféle objektumra"

De hisz ugyanúgy működik. Mindkét esetben azt nézed meg, hogy az adott objektum típus része-e a megadott string. Csak épp string esetében a részvizsgálat azt jelenti, hogy a string tartalmazza-e, tömb esetében pedig az, hogy a tömb tartalmazza-e (nem pedig az, hogy a tömbben lévő valamelyik string tartalmazza-e)

Nem egészen. Pythonban a dokumentáció szerint az in definíciója sequence típusok esetén:
x in s : True if an item of s is equal to x, else False (1)

alatta az (1):
While the in and not in operations are used only for simple containment testing in the general case, some specialised sequences (such as str, bytes and bytearray) also use them for subsequence testing:

>>> "gg" in "eggs"
True

Szóval Huncraft-nak igaza van. Python-ban sem teljesen konzisztens az "in". Más kérdés, hogy ezekre a típusokra ez praktikus, csak nem minden sequence típus esetén működik az "in" subsequence testing-ként is pl.:
>>> x=[1, 3, 5, 7]
>>> [1, 3, 5] in x
False

--
♙♘♗♖♕♔

Fordítok Linuxos példára, hátha úgy jobban érthető a problémám:
'grep' Vs 'grep -w' - Előbbi részleges egyezést néz, utóbbi csak teljes egyezést. Ezért is idegesít kicsit az include, mert egyik objektumra "grep-ként", másikra "grep -w"-ként viselkedik..

szerk: Ha minden objektumnál ugyan úgy működne, akkor azt várnám, hogy mindenhol teljes egyezést nézzen (tekintve, hogy tömbben részleges egyezést nézni tényleg elég hülyén jönne ki)
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..

Napokban sikerült belefutni egy érdekességbe az include-al kapcsolatban --- ime:


x = Object.new

x.define_singleton_method(:==) { |_| false }
x == x  # => false
[x].include? x # => true

Ez persze egy az egyben ellent mond ennek : http://ruby-doc.org/core-2.5.0/Array.html#method-i-include-3F

szerk: https://www.codewars.com/kata/527c3755bb2890568500000d ez alapjan jutott ez az eszembe.
De az erdekes, hogy valoszinuleg annak aki az Array#include?-ot irta, az ilyen "corner-case" -ek elkerultek a figyelmet :)