2015-06-17 6 views
1

Новичок здесь. Заранее спасибо.Рубин: Удаление переменной из массива

Идея здесь сродни тому, чтобы случайно достать карту из колоды карт. Я хочу навсегда вывести случайное число из массива.

Мой код дает мне ошибку относительно 'delete!' метод. "Неопределенный метод delete!' for [1, 2, 3, 4, 5, 6, 7, 8]:Array (repl):6:in инициализировать '". Но я знаю, что здесь может быть полдюжины ошибок.

Я прокомментировал приведенный ниже код, чтобы вы могли следить за моим любительским мыслительным процессом. Я уверен, что есть какой-то отличный способ написать все в двух строках кода, которые я еще не испытал. Вы можете помочь?

array = [1, 2, 3, 4, 5, 6, 7, 8] 
# Create array of sequential numbers 

high_number = array.length - 1 
# Determining length of array for next line, offset by 1 for array 

rand_number = rand(0..high_number) 
# Create a random number from 0 (first array position) through high num 

draw = array[rand_number] 
# drawing that position number from array (passed on to another action) 

array.delete!(rand_number) 
# make sure the next time I loop through this array that number can't be drawn again 

ответ

2

Метод для массива delete!. Возможно, вы имели в виду delete?

удалить (объект) → пункт или ноль

Удаляет все элементы из себя, равные OBJ.

Возвращает последний удаленный элемент или ноль, если соответствующий элемент не найден.

Если задан дополнительный кодовый блок, возвращается результат блока, если элемент не найден. (Чтобы удалить ноль элементов и получить информативный возвращаемое значение, используйте #compact!)

a = [ "a", "b", "b", "b", "c" ] 
a.delete("b")     #=> "b" 
a        #=> ["a", "c"] 
a.delete("z")     #=> nil 
a.delete("z") { "not found" } #=> "not found" 

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

delete_at (индекс) → OBJ или ноль

Удаляет элемент по указанному индексу, возвращая этот элемент, или ноль, если индекс находится вне диапазона.

См. Также #slice!

a = ["ant", "bat", "cat", "dog"] 
a.delete_at(2) #=> "cat" 
a     #=> ["ant", "bat", "dog"] 
a.delete_at(99) #=> nil 

Вы также можете быть заинтересованы в поиске на некоторых других методов на Array, такие как shuffle, sample и pop. Полная документация доступна по адресу ruby-doc.org.

+0

Спасибо!Это приводит меня к новой ошибке, но одна проблема. :) – user1647736

0

При удалении элемента, просто чтобы убедиться, что это не перерисованы то Array#sample возможность

ar = (1..8).to_a 
p ar.sample(3) # => [1, 8, 6] 

массив остается неизменным.

0

Как пишет Ajedi32, просмотрите shuffle и pop и ознакомьтесь с различными методами массива.

Затем вы можете переписать код, как:

array = (1..8).to_a 
# Create array of sequential numbers 

draw = array.shuffle!.pop 
# randomize order of array in place, remove and return last element 
0
>> a = (1..8).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8] 
>> b = a.delete(a.sample) 
=> 6 
>> a 
=> [1, 2, 3, 4, 5, 7, 8] 
>> b 
=> 6 
Смежные вопросы