Получение доходности для работы над вложенными массивами массивов - Ruby - PullRequest
0 голосов
/ 13 марта 2012

Итак, скажем, у меня есть массив, который выглядит следующим образом:

t = [
      [
        [["Armando", "P"],["Dave", "S"]],
        [["Richard", "R"],["Michael", "S"]],
      ],
      [
        [["Allen", "S"],["Omer", "P"]],
        [["David E.", "R"], ["Richard X.", "P"]]
      ]
    ]

По сути, я хочу оценить каждый внутренний массив, который имеет массив из двух элементов - например, первый в приведенном выше фрагменте кодаэто Armando, and Dave.Оба из них являются двумя элементами в одном массиве, который является первым элементом в родительском массиве.

Что я хочу сделать, это взять этот первый «подмассив» и присвоить его переменной.Передайте эту переменную другому имеющемуся у меня методу (скажем, my_method), который затем вернет только один из этих элементов в подмассиве.

Я думаю, что хочу использовать yield, но я не совсемконечно, как это сделать.

Я думал примерно так:

t.each do |entry|
  a = entry
  yield my_method(a) 
end

Но я путаюсь с передачей yield и массивов hella complex.

Как мне получить то, что я ищу?

Редактировать 1 : Это то, что я делаю с t, но все еще получаю ошибку, которая указываетчто я делаю что-то не так с доходностью и тому подобное.

Это мой основной метод, который будет оценивать t:

def rps_game_winner(game)
    raise WrongNumberOfPlayersError unless game.length == 2
    if (game[0][1] =~ /[r]/i && game[1][1] =~ /[s]/i) || (game[0][1] =~ /[s]/i && game[1][1] =~ /[p]/i) || (game[0][1] =~ /[p]/i && game[1][1] =~ /[r]/i)
        return game[0]
    elsif (game[0][1] =~ /[r]/i && game[1][1] =~ /[p]/i) || (game[0][1] =~ /[s]/i && game[1][1] =~ /[r]/i) || (game[0][1] =~ /[p]/i && game[1][1] =~ /[s]/i)
        return game[1]
    elsif game[0][1] == game[1][1]
        return game[0]
    else
        raise NoSuchStrategyError.new
    end
end

def rps_tournament_winner(t)
   t.each do |pair|
    yield pair
   end  
end

rps_tournament_winner(t) { |x| rps_game_winner(x)  }

Итак, ошибка, которую я получаю: NoSuchStrategyError: NoSuchStrategyError - это означает, что yield передает значение в блок, и это передается моему методу rps_game_winner, и он что-то оценивает и выдает эту ошибку - для метода.Но он не оценивает его должным образом .... потому что он должен смотреть на Armando и Dave и возвращать победителя, затем он должен вернуться и продолжить поиск следующей пары и вернуть победителя и т. Д.

Есть идеи, почему это не работает?

1 Ответ

1 голос
/ 13 марта 2012

СМОТРИТЕ РЕДАКТИРОВАТЬ НИЖЕ

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

t = [
      [
        [["Armando", "P"],["Dave", "S"]],
        [["Richard", "R"],["Michael", "S"]],
      ],
      [
        [["Allen", "S"],["Omer", "P"]],
        [["David E.", "R"], ["Richard X.", "P"]]
      ]
    ]

def get_name_pairs(t)    
  t.each do |a|
    a.each do |x|
      yield x[0], x[1]
    end
  end
end

def print_first_names(person1, person2)
  puts person1[0]
  puts person2[0]
end

get_name_pairs(t) {|x, y| print_first_names(x, y)}

EDIT

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

# HEY IT IS ROCK PAPER SCISSORS!
t = [
  [
    [["Armando", "P"],["Dave", "S"]],
    [["Richard", "R"],["Michael", "S"]],
  ],
  [
    [["Allen", "S"],["Omer", "P"]],
    [["David E.", "R"], ["Richard X.", "P"]]
  ]
]

def rps_game_winner(game)
  raise WrongNumberOfPlayersError unless game.length == 2
  if (game[0][1] =~ /[r]/i && game[1][1] =~ /[s]/i) ||
      (game[0][1] =~ /[s]/i && game[1][1] =~ /[p]/i) ||
      (game[0][1] =~ /[p]/i && game[1][1] =~ /[r]/i)
    return game[0]
  elsif (game[0][1] =~ /[r]/i && game[1][1] =~ /[p]/i) ||
      (game[0][1] =~ /[s]/i && game[1][1] =~ /[r]/i) ||
      (game[0][1] =~ /[p]/i && game[1][1] =~ /[s]/i)
    return game[1]
  elsif game[0][1] == game[1][1]
    return game[0]
  else
    raise NoSuchStrategyError.new
  end
end

def rps_tournament_winner(t)
  t.each do |level|
    level.each do |game|
      yield game
    end
  end  
end

rps_tournament_winner(t) { |x| puts rps_game_winner(x)  }

Это выводит

Dave
S
Richard
R
Allen
S
Richard X.
P
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...