рубиновые проблемы для методов - PullRequest
0 голосов
/ 21 июля 2010

У меня есть следующий код. Я хочу использовать методы для myserver1 и myserver2 и передать им адреса, которые были повторены в методе send_to_servers. Я не могу этого сделать. Пожалуйста помоги. Если у меня не будет двух этих адресов для приема, я не смогу делать то, что мне нужно. Заранее спасибо.

class Addresses
  def add
    @addresses = %w(me@gmail.com me2@gmail.com me3@gmail.com)
  end

  def myserver1
    puts "Sending email from myserver1 with address #{@address}"
  end

  def myserver2
    puts "Sending email from myserver2 with address #{@address}"
  end

  def servers
    serv = [myserver1, myserver2]
  end
  #  def servers
  #    serv = (1..2).to_a       # Your list of servers goes here
  #  end


  def send_to_servers(servers)
    @addresses.each.with_index do |address, i|
      server = servers[i % servers.length]
      puts "Sending address #{address} to server #{server}"
      @address = address
    end
  end

end


a = Addresses.new
a.add
servers = a.servers
a.send_to_servers(servers)

Ответы [ 3 ]

1 голос
/ 21 июля 2010

Ваша проблема в том, что методы вашего сервера ничего не возвращают:

def myserver1
  puts "Sending email from myserver1 with address #{@address}"
end

Этот метод выводит сообщение и возвращает nil. puts всегда возвращает nil.

Таким образом, когда вы делаете [myserver1, myserver2], он печатает два сообщения и возвращает [nil, nil].

Серверы - это вещи, они, вероятно, должны быть объектами, а не методами. Методы - это действия, которые делают и / или возвращают что-либо. Попробуйте что-то вроде этого:

class Server
  def initialize(name)
    @name = name
  end

  def send_address(address)
    puts "Sending email from #{@name} with address #{address}"
  end
end

addresses = %w(me@gmail.com me2@gmail.com me3@gmail.com)
servers = [Server.new("server one"), Server.new("server two")]
addresses.each_with_index do |address, i|
  server = servers[i % servers.length]
  server.send_address(address)
end
1 голос
/ 21 июля 2010

Я считаю, что ваш код должен быть реорганизован, чтобы быть ближе к реальному миру.

Вы хотите loop through a list of email addresses and send each iteration to myserver2 and myserver2.

Это означает, что вам нужно иметь декартово произведение электронной почты и серверов и «отправить» этой паре.

require 'net/smtp'

emails = %w{email1@email.com email2@email.com}
servers = %w{server1 server2}
emails.product(servers).each do |address, server|
  Net::SMTP.start(server) do |smtp|
    smtp.send_message 'Body', 'from@example.com', [address]
  end
end
1 голос
/ 21 июля 2010

Неясно, как вы, возможно, захотите структурировать его, но вот краткая реализация, которая, я думаю, соответствует вашему описанию.

def myserver1(address)
  # Do something with address
end

def myserver2(address)
  # Do something with address
end

addresses = %w(me@gmail.com me2@gmail.com me3@gmail.com)
servers = %w(myserver1 myserver2).cycle
addresses.each do |address|
  send(servers.next, address)
end

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

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