Про хеши и ассоциативные массивы, в ruby и php


#1

@kvokka , если там, где ты сейчас, не так жарко, как там, где сейчас я… то, уверен, тебе, как всегда, будет что мне ответить. У нас же душняк такой, что у народа соответственно крышняк съезжает, причем самым странным порой образом съезжает… for example, это я вчера вечером щелкнул на Невском. Комментарии излишни, суди сам, как здесь душно.

Ну а вопрос такой. Набросал тут игрушку на рубях… по сути это простой покер на костях, по ссылке. И вот в чем вопрос; верхняя строчка показанного далее хелпера окончательно формирует @die как массив пяти выпавших значений костей, который далее и считаем. Потом объявляю хеш, который обрабатываю и наполняю чем-то, напоминающим оператор инкремента (по крайней мере, в php именно так называется ++), это помогает мне в дальнейшем считать комбинации выпавших костей (показываю код фрагментарно, ибо еще в работе):

module PokerHelper
def one
 @die = @die.reject {|c| c.blank?}.map(&:to_i) 
 @numVals = Hash.new(0) 
 for @theval in 1..6 
 for @dienum in 0..4 
 if @die[@dienum] == @theval 
 @numVals[@theval] +=1 
 end 
end 
end

Почему хеш? - потому что, если бы я объявил здесь массив - сразу же получил бы NoMethodError блаблабла for nil:NilClass (пробовал), и придется это разруливать посредством #dig или какого-то безопасного оператора. А с хешем все легче, проще и короче, пашет именно так, как показал. Без никаких проблем. Дальше я могу работать уже как с хешем, так и с массивом на его основе, считая разные комбинации (их немного):

@numVals1 = Array.new(@numVals.values) 
 @two_pairs = @numVals1.find_all { |x| @numVals1.count(x) > 1 } 
 if @two_pairs.include?(2) 
 @cash = @cash.to_i + 3  
 flash[:success] = 'Two pairs! You bet 2. Payoff is 3.'
 elsif [1,2,3,4,5].index{ |x| !@numVals.include?(x) }.nil? 
 @cash = @cash.to_i + 7 
 flash[:success] = 'You have a street! You bet 2. Payoff is 7.'
 # etc

Вопрос. В пыхе ассоциативный массив и хеш - это практически одно и то же. А вот здесь, получается, нет. Насколько я понимаю, дело не столько в руби, сколько в рельсах? Объясни тупому пыхеру; логику построить мне несложно, но, чую, врубаюсь я несколько поверхностно.


(Kvokka) #2

зачем столько переменных? инстансных причем.
первуя функция меняется на (die.select(&:any?).map(&:to_i) + Array(4) { rand 1..6)).first(4)
и нафиг хеш тут не нужен. и зачем тут to_i не ясно, ну да хрен с ним

далее- рельсы тут не при чем, дело только в руби. почитай руби под микроскопом книжку, там рассказано как работает хеш и встанет все на свои места. вкратце ассоциативный массив это несколько более простая структура данных.

и тебе привет


#3

блин, было предчувствие, что так ответишь. :smiley:
спс, почитаю и поэкспериментирую.


(Magic2k) #4

отправлять за этим в Ruby under the microscope как-то жестко )))