[英]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 &:call
或array.map &:call
這段代碼的工作方式:
(1..20).each do |p|
array << method(p)
end
方法method(p)
被執行
執行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,這是將程序代碼存儲在變量中的更靈活的方法。
基於此更新,存在兩個問題:
實際上,您在connect
方法中確實有一些puts
語句,無論該方法的流程如何,它們都會始終輸出某些內容。
在ruby中,方法中的最后一條語句是該方法返回的值。 puts
方法不返回任何內容,而puts
是該方法的最后一行(即使它進入了救援塊)。 您可以嘗試重寫該方法,使所需的值是上次(可能是混亂的),也可以在末尾添加return [something]
,以確保返回所需的值(其中[something]
是要作為變量的變量)。回來)。
另外,只是為了解決您在評論中的發言: 即使我只是將所有內容都推送到了array中,我真的不明白為什么打印出來 。
要記住的關鍵是這是兩個單獨的操作:首先,該方法稱為...,直到將返回值壓入數組。 該方法不知道其返回值在哪里,因此無論如何都將執行那些puts
語句,除非您在該方法中放置了一些內容以對其進行過濾(例如if
語句,您已經至少有一次)看起來)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.