2010-07-21 83 views
0

我有以下代码。我想使用myserver1和myserver2的方法,并将它们在send_to_servers方法中迭代的地址传递给它们。我似乎无法做到这一点。请帮忙。除非我可以改变这两个接收地址,否则我将无法做我需要做的事情。提前致谢。方法的红宝石问题

class Addresses 
    def add 
    @addresses = %w([email protected] [email protected] [email protected]) 
    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) 
+0

这真的不清楚这个代码是应该做的。我的意思是,我可以看到它的作用,但我怀疑它符合你的意图。您能简要介绍一下您的代码需要执行的步骤吗? – 2010-07-21 00:57:17

+0

我想遍历电子邮件地址列表,并通过每种方法将每次迭代发送到myserver2和myserver2。 – rahrahruby 2010-07-21 00:59:47

回答

1

目前还不清楚,你可能会想如何构建它,但这里是一个简洁的方式,我认为满足您的描述。

def myserver1(address) 
    # Do something with address 
end 

def myserver2(address) 
    # Do something with address 
end 

addresses = %w([email protected] [email protected] [email protected]) 
servers = %w(myserver1 myserver2).cycle 
addresses.each do |address| 
    send(servers.next, address) 
end 

道歉,如果我失去了对你的问题至关重要的这个。请随时评论需要哪些额外功能来帮助确定规格。

+1

我认为它应该在服务器之间交替,并且可能处理可变数量的服务器。 – AShelly 2010-07-21 01:09:54

+0

我试图坚持评论中给出的描述,而不是破译查看破坏代码的意图的细微差别。 – 2010-07-21 01:15:56

+0

我喜欢这个代码,除了它在发送服务器时不会在服务器之间切换的事实之外,它将是完美的。它从每个服务器发送相同的消息。如果您可以更改它,以便它从第一台服务器发送第一个地址,并从第​​二台服务器发送第二个地址,那就太好了。谢谢你的帮助!!! – rahrahruby 2010-07-21 16:56:30

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([email protected] [email protected] [email protected]) 
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 
+0

你能给我一个它应该如何看的例子吗? – rahrahruby 2010-07-21 01:17:12

+0

我添加了一个例子。这段代码是做你想做的吗? – mckeed 2010-07-21 01:22:31

+0

所以我server.new [Server.new(“服务器一”),Server.new(“服务器二”)] 将包含我的服务器代码的类是正确的吗? – rahrahruby 2010-07-21 01:23:31

1

我相信你的代码应该被重构,以更接近现实世界。

您想要loop through a list of email addresses and send each iteration to myserver2 and myserver2

这意味着你需要拥有电子邮件和服务器的笛卡尔积,并且“发送”给那一对。

require 'net/smtp' 

emails = %w{[email protected] [email protected]} 
servers = %w{server1 server2} 
emails.product(servers).each do |address, server| 
    Net::SMTP.start(server) do |smtp| 
    smtp.send_message 'Body', '[email protected]', [address] 
    end 
end 
+0

偏题:您可以将'| address,server |'作为块参数。它会自动解包。 – mckeed 2010-07-21 01:18:42

+0

问题是我正在使用ruby邮件类发送消息。我希望能够通过邮件类的“到”部分重复的电子邮件地址 – rahrahruby 2010-07-21 01:31:02

+0

@mckeed,感谢提示 - 不知道这一点。我会更新代码。 – 2010-07-21 01:31:06