我想知道为什么数组会打印内容,即使没有被告知。这是一个例子,因为我不善于解释。
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;&#;运算符只是将任何内容添加到数组中?
答案 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].call
或array.map &:call
答案 1 :(得分:1)
在此代码中的工作方式:
(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和Lambdas,这是一种更灵活的方式将程序代码存储在变量中。
答案 2 :(得分:1)
根据更新,有两个问题:
你确实在puts
方法中有一些connect
语句,考虑到方法的流程,它总是输出一些东西,无论如何。
在ruby中,方法中的最后一个语句是从该方法返回的值。 puts
方法不返回任何内容,puts
是方法的最后一行(即使它插入到救援块中)。你可以尝试重写方法,这样你想要的值是最后一次(可能是凌乱的),或者只是在最后添加return [something]
,以确保返回你想要的值(其中[something]
是要返回的变量。)
另外,只是为了在评论中说明你的陈述:我真的不明白为什么打印输出即使我只是将它全部推入和数组。
要记住的关键是那些是两个单独的操作:首先,调用该方法......然后将返回值推送到数组。该方法无法确定其返回值的位置,因此这些puts
语句将被执行,除非您在方法中添加一些内容来过滤它们(如if
语句,您已经至少有一次,看起来像。)