打印Ruby数组的内容

时间:2014-08-05 21:23:26

标签: ruby

我想知道为什么数组会打印内容,即使没有被告知。这是一个例子,因为我不善于解释。

    def connect(host)
    begin
        sock = Socket.new(:INET, :STREAM)
        sockaddr = Socket.sockaddr_in(23, host)

        puts "Telnet available on #{host}\n" if sock.connect(sockaddr)

    rescue Errno::ECONNREFUSED
        puts "Telnet unavailable on #{host}"
    end
end


def scan
    @host = str_r(@host) # Formats IP

        (1..255).each do |oct|
            begin
                nhost = @host+oct.to_s
                @array << connect(nhost)

            rescue Errno::EHOSTUNREACH
                #puts "Host #{nhost} unreachable!"
            end
        end
    #puts @array
end

在方法循环中尝试连接到主机的地方。即使我还没有告诉它要把它放到&#39;什么,它确实。它将方法(p)的结果逐一放入。我宁愿做的是将所有结果保存到一个数组中,然后在尝试连接到所有主机时完成所有结果的打印。不是&#39;&lt;&lt;&#;运算符只是将任何内容添加到数组中?

3 个答案:

答案 0 :(得分:2)

ruby doc中它说

  

ary&lt;&lt; obj→ary

     

追加 - 将给定对象推送到此数组的末尾。该表达式返回数组本身,因此可以将多个附加链接在一起。

这是一种语法糖;其他编写代码的方法可能是

  • @array.<<(connect(nhost))
  • @array.send(:<<, connect(nhost))

您推送的对象由返回值connect(nhost) 给出,它是您推送方法的参数。(并且在方法调用中评估为任何其他参数)。

如果您不希望评估您的方法,可以使用这样的Proc对象:

(1..255).each do |oct|
  nhost = @host+oct.to_s
  array << -> { connect(nhost) }
  # same as
  # array.push(Proc.new { connect(nhost) })
end

然后像下面这样调用Proc对象:array[0].callarray.map &:call

答案 1 :(得分:1)

在此代码中的工作方式:

(1..20).each do |p|
    array << method(p)
end
  1. 执行方法method(p)

  2. 执行结果         method(p)(返回值)附加到数组

  3. 如果您希望存储该方法以供以后评估,可以使用一些技巧。一个简单的方法是将方法存储为字符串......

    (1..20).each do |p|
        array << 'method(p)'
    end
    

    ...然后使用eval语句执行它..

    eval array[0] # will evaluate the string in array[0] as ruby code.
    

    您可能还想查找Procs和Lambdas,这是一种更灵活的方式将程序代码存储在变量中。

答案 2 :(得分:1)

根据更新,有两个问题:

  1. 你确实在puts方法中有一些connect语句,考虑到方法的流程,它总是输出一些东西,无论如何。

  2. 在ruby中,方法中的最后一个语句是从该方法返回的值。 puts方法不返回任何内容,puts是方法的最后一行(即使它插入到救援块中)。你可以尝试重写方法,这样你想要的值是最后一次(可能是凌乱的),或者只是在最后添加return [something],以确保返回你想要的值(其中[something]是要返回的变量。)

  3. 另外,只是为了在评论中说明你的陈述:我真的不明白为什么打印输出即使我只是将它全部推入和数组

    要记住的关键是那些是两个单独的操作:首先,调用该方法......然后将返回值推送到数组。该方法无法确定其返回值的位置,因此这些puts语句将被执行,除非您在方法中添加一些内容来过滤它们(如if语句,您已经至少有一次,看起来像。)