簡體   English   中英

打印Ruby數組的內容

[英]Printing contents of Ruby array

我想知道為什么數組即使不告訴也會打印內容。 這是一個示例,因為我不善於解釋。

    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

方法循環在哪里做類似嘗試連接到主機的事情。 即使我沒有告訴它“放入”任何東西,它也可以。 它將方法(p)的結果一一列出。 我希望將所有結果保存到一個數組中,然后在嘗試連接到所有主機后將它們全部打印出來。 '<<'運算符不是簡單地將任何內容添加到數組中嗎?

紅寶石文檔中

ary << obj→ary

附加-將給定對象推到該數組的末尾。 此表達式返回數組本身,因此可以將多個追加鏈接在一起。

這是一種語法糖; 其他編寫代碼的方法可能是

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

您推送的對象由connect(nhost)的返回值給定, 它是push方法的參數。 (並且在方法調用時與其他任何參數一起求值)。

如果您不希望對方法求值,則可以使用如下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].call array.map &:callarray.map &:call

這段代碼的工作方式:

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

  2. 執行method(p)的結果(返回值)將附加到數組中

如果您想存儲該方法以供以后評估,可以使用一些技巧。 一種簡單的方法是將方法存儲為字符串。

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

...,然后使用eval語句執行。

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

您可能還需要查找Procs和Lambda,這是將程序代碼存儲在變量中的更靈活的方法。

基於此更新,存在兩個問題:

  1. 實際上,您在connect方法中確實有一些puts語句,無論該方法的流程如何,它們都會始終輸出某些內容。

  2. 在ruby中,方法中的最后一條語句是該方法返回的值。 puts方法不返回任何內容,而puts是該方法的最后一行(即使它進入了救援塊)。 您可以嘗試重寫該方法,使所需的值是上次(可能是混亂的),也可以在末尾添加return [something] ,以確保返回所需的值(其中[something]是要作為變量的變量)。回來)。

另外,只是為了解決您在評論中的發言: 即使我只是將所有內容都推送到了array中,我真的不明白為什么打印出來

要記住的關鍵是這是兩個單獨的操作:首先,該方法稱為...,直到將返回值壓入數組。 該方法不知道其返回值在哪里,因此無論如何都將執行那些puts語句,除非您在該方法中放置了一些內容以對其進行過濾(例如if語句,您已經至少有一次)看起來)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM