2015-09-14 2 views
0

В Python существует встроенный метод, называемый __getitem__, который вы можете добавить в свои классы, чтобы выполнить пользовательскую реализацию получения элемента. Например:Имеет ли Ruby встроенный метод getitem?

class containerlist (object): 

    def __init__(self, *args): 
     self.container = [x for x in args] 

    def __getitem__(self, i): 
     return self.container[i] 

В Ruby есть эквивалент для этого или других Python встроенных функций, таких как __len__ или __contains__?

+2

Этот вопрос в основном * «как вы Ruby?» * И, следовательно, слишком широкие. – jonrsharpe

+1

Что это связано с рубином или irb? –

ответ

3

В Ruby вы получаете доступ к элементам с использованием [], метод называется, ну, [].

+0

В случае Hash и Array, где это соглашение также используется для других вещей, чтобы интерфейс чувствовал себя знакомым. – tadman

1

длина массива (также хэши) в рубине может быть написана (по крайней мере, я знаю) двумя способами. вызов length или count методы для объекта. для строки onjects вы можете использовать метод length

irb(main):001:0> x = "some string" 
=> "some string" 
irb(main):002:0> x.class 
=> String 
irb(main):003:0> x.length 
=> 11 
irb(main):005:0> y = (1..9).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
irb(main):006:0> y.length 
=> 9 
irb(main):007:0> y.count 
=> 9 
irb(main):008:0> 

__contains__ эквивалент рубина может быть include? метод. на самом деле более вероятно, что ключевое слово in.

irb(main):008:0> x.include?('s') 
=> true 
irb(main):009:0> y.include?('2') 
=> false 
irb(main):010:0> y.include?(2) 
=> true 

find_index для массивов и index строки могут быть полезными.

irb(main):013:0> y.find_index(3) 
=> 2 
irb(main):016:0> x.index('s') 
=> 0 
irb(main):017:0> x.index('s', 4) #the second argument is offset value. 
=> 5 

Я не опытный рубист, но надеюсь, что это было бы полезно для первых шагов. Также надеюсь, не вводить в заблуждение вас на вашем пути рубинового :)

+1

'count' может возвращать правильный результат, но это неправильный метод для вызова в таких случаях. См. [Элементы стиля в Ruby # 13: Length vs Size vs Count] (http://batsov.com/articles/2014/02/17/the-elements-of-style-in-ruby-number-13- длина-vs-size-vs-count /) – cremno

+0

спасибо за такой ресурс и объяснение – marmeladze

3

Просто, чтобы проиллюстрировать @ Йорг W Миттаг

class Containerlist 
    def initialize(*args) 
    @container = args 
    end 

    def [](i) 
    @container[i] 
    end 
end 

cl = Containerlist.new(3,4,5) #new creates a new obj and calls initialize 
p cl[1] #interpreted as cl.[](1) # => 4 

О __len__: apparently, Python интерпретирует len(a_list), как a_list.__len__, для размещения начинающих пользователей. Ruby предпочитает size и/или length и не делает такой вещи - это всего лишь a_list.size. Итак:

class Containerlist 
    def size 
    @container.size 
    end 
end 
p cl.size # => 3 
Смежные вопросы