Изучите , Доктрина 1.2 Доктрины .
реализует Активную Запись. Доктриной 2 + является DataMapper ORM.
кроме того, проверьте Xyster. Это основано на шаблоне Картопостроителя Данных.
кроме того, смотрите на DataMapper по сравнению с Активной Записью .
a.each_index { |i| j = a[i].index 'S'; p [i, j] if j }
Обновление: ОК, мы можем вернуть несколько совпадений. Вероятно, лучше всего использовать основной API как можно больше, чем выполнять итерацию один за другим с интерпретируемым кодом Ruby, поэтому давайте добавим несколько выходов по короткому замыканию и итерационных вычислений, чтобы разбить строку на части. На этот раз он организован как метод экземпляра в Array и возвращает массив [row, col] подмассивы.
a = [ %w{ a b c d },
%w{ S },
%w{ S S S x y z },
%w{ S S S S S S },
%w{ x y z S },
%w{ x y S a b },
%w{ x },
%w{ } ]
class Array
def locate2d test
r = []
each_index do |i|
row, j0 = self[i], 0
while row.include? test
if j = (row.index test)
r << [i, j0 + j]
j += 1
j0 += j
row = row.drop j
end
end
end
r
end
end
p a.locate2d 'S'
Это сделает это:
array = [['x', 'x',' x','x'],
['x', 'S',' ','x'],
['x', 'x',' x','x']]
p array.index(array.detect{|aa| aa.include?('S')}) # prints 1
Если вам также нужен индекс 'S в подмассиве, вы можете:
row = array.detect{|aa| aa.include?('S')}
p [row.index('S'), array.index(row)] # prints [1,1]
Вы можете найти первое, в котором находится абсолютная позиция, сгладив массив:
pos = array.flatten.index('S')
Затем получите количество столбцов в строке:
ncols = array.first.size
затем
row = pos / ncols
col = pos % ncols
Не -Руби-конкретный ответ: вы пытаетесь напечатать "S" в обоих примерах, но только последний имеет "S" в массиве. Первый имеет ['x', 'S', '', 'x']. Что вам нужно сделать (если Ruby не делает этого за вас), так это посмотреть на каждый член в массиве и найти в нем «S». Если в этом элементе содержится «S», выведите его.
x ',' S ',' ',' x ']. Что вам нужно сделать (если Ruby не делает этого за вас), так это посмотреть на каждый член в массиве и найти в нем «S». Если в этом элементе содержится «S», выведите его. x ',' S ',' ',' x ']. Что вам нужно сделать (если Ruby не делает этого за вас), так это посмотреть на каждый член в массиве и найти в нем «S». Если в этом элементе содержится «S», выведите его.array = [['x', 'x',' x','x'],
['x', 'S',' ','x'],
['x', 'x',' x','x']]
class Array
def my_index item
self.each_with_index{|raw, i| return i if raw.include? item}
return
end
end
p array.my_index("S") #=>1
p array.my_index("Not Exist Item") #=> nil
Задает оба индекса первого вхождения элемента за один проход на подмассивах
a = [[...],[...],[...],[...]]
element = 'S'
result_i = result_j = nil
a.each_with_index do|row, i|
if (j = row.index(element))
result_i, result_j = i, j
break
end
end