方法的红宝石问题

时间:2010-07-21 00:26:53

标签: ruby

我有以下代码。我想使用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 个答案:

答案 0 :(得分:1)

目前还不清楚你可能想要如何构建它,但这是一个简洁的实现,我认为符合你的描述。

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

道歉,如果我遗漏了对你的问题至关重要的事情。请随时评论需要哪些额外功能来帮助确定规范。

答案 1 :(得分:1)

您的问题是您的服务器方法没有返回任何内容:

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

此方法打印出消息并返回nilputs始终返回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

答案 2 :(得分:1)

我相信你的代码应该被重构为更贴近现实世界。

您想要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