2015-07-03 3 views
-1
class Filter 

    def filterMethod(arr) 

    new_array1 = puts arr.select.each_with_index { |str, i| i.odd? } 
    yield 
    new_array2 = puts arr.select.each_with_index { |str, i| i.even? } 
    yield 
    new_array3 = puts arr.reject! {|x| x < '3'} 
    yield 
    new_array4 = puts arr.reject! {|x| x < '4'} 
    yield 
end 
end 

puts "Enter a list of numbers" 
list = Array.new 

list = gets.chomp 
F= Filter.new 
F.filterMethod(list) {puts "--------"} 
#list = Array.new 

Я не могу получить доступ к массиву в классе. Как получить значение массива в методе. Его показ следующее сообщение об ошибке:Ошибка NoMethod для выбранного оператора

"`filterMethod': private method 'select' called for nil:NilClass (NoMethodError)"

+0

Ваш вопрос, кажется, быть искажены. Вы вставляете фактическое сообщение и ошибку? – shivam

+0

Что вы думаете? – sawa

ответ

2

Давайте посмотрим:

list = Array.new 
# => [] # An Array 

Теперь

list = gets.chomp 
asd 
# => "asd" # A String 

F= Filter.new 
F.filterMethod(list) # You are passing a String 

В Filter#filterMethod

# arr is supposed to be an Array 
arr.select.each_with_index { |str, i| i.odd? } # list is passed as argument which is a String 

Следовательно:

NoMethodError: private method `select' called for "asd":String

Вы можете преобразовать строку в массив, разделив его, либо с помощью .chars или .split (и служит другой цели, прочитать документы). Здесь:

list = gets.chomp 
12345 
# => "12345" # A String 
list = list.chars 
# => ["1", "2", "3", "4", "5"] # An Array 

или получить целочисленный массив (как вы делаете операции Integer в методе):

list = list.chars.map(&:to_i) 
# => [1, 2, 3, 4, 5] 
+0

Что нужно сделать, чтобы arr был массивом в методе filterMethod? – PooK

+0

что зависит. Как вы хотите передать массив? Можете ли вы разместить образец 'arr'? – shivam

+0

Я передаю массив с консоли, как 1 2 3 4 5 – PooK

0
list = gets.chomp 

возвращает строку. Кажется, вы ожидаете массив, поэтому здесь нужно что-то лишнее. например:

list = gets.chomp.split 

Это еще список ул, хотя, так что вам, возможно, потребуется еще один шаг, если вы хотите Интс

list = gets.chomp.split.map{|x|x.to_i}