я могу объявить массив, где один из элементов массива является необъявленной переменной? (Рубин) - PullRequest
1 голос
/ 25 января 2010
#input_from_the_net = ""

my_array = [ ["Header name" , input_from_the_net] ]

input_from_the_net = "a value scraped from the net"

puts "#{my_array[0][0]} is #{my_array[0][1]}"

EDIT:

Я использую переменную input_from_the_net позже в цикле и присваиваю ее значение хешу. Этот хеш затем сохраняется внутри другого хеша. Если я использую input_from_the_net.replace("a value scraped from the net"), он заменяет значение внутри всех хешей. Это не желательно. Я хочу, чтобы все хеши содержали правильные значения.

EDIT2: более подробный пример кода

`require 'pp'
input_from_the_net = ""

def parse_the_website()
  (0..5).each { |index| 
    input_from_the_net = index+23
    @my_hash[index] = {@my_array[0][0] => input_from_the_net}
  } 
end

@my_array = [ ["Header name" , input_from_the_net] ] 
       #my_array is used on different places of the code

@my_hash = {}
parse_the_website
pp @my_hash

Q1: можно ли заставить работать и не изменять порядок строк ?

Q2: если я раскомментирую #input_from_the_net = "", то значение переменной input_from_the_net на момент печати будет "", а не "значением, извлеченным из сети". Как получилось?

Ответы [ 2 ]

5 голосов
/ 25 января 2010

Вы можете сохранить тот же порядок, что и у вас, но вам нужно использовать replace:

input_from_the_net = ""

my_array = [ ["Header name" , input_from_the_net] ]

input_from_the_net.replace("a value scraped from the net")

puts "#{my_array[0][0]} is #{my_array[0][1]}"

# Outputs: Header name is a value scraped from the net

Каждый раз, когда вы используете = со строкой, она создает новую строку и присваивает ее переменной. Чтобы заменить его без создания новой строки, вы используете метод String.replace.

Для развлечения вы можете использовать irb, чтобы проверить это:

>> str = "Hello"
=> "Hello"
>> str.object_id
=> 2156902220                  # original id
>> str = "New String"
=> "New String"
>> str.object_id
=> 2156889960                  # different id
>> str.replace("Third String")
=> "Third String"
>> str.object_id
=> 2156889960                  # same id
1 голос
/ 26 января 2010

Рекомендую сделать простой урок:

class Netinput
  attr_accessor :netinput

def initialize(netinput = "")
  @netinput = netinput
end

end

Тогда используйте это так:

input_from_the_net = "our test string"

#Netinput can take a string or no argument
my_array = [ ["Header name" , Netinput.new()] ]

my_array[0][1].netinput = input_from_the_net

puts "#{my_array[0][0]} is #{my_array[0][1].netinput}"

# Outputs: Header name is our test string

При таком подходе вторым элементом каждого массива является объект, который имеет собственную переменную экземпляра «netinput». Надеюсь, это работает для вас.

...