新手问题 为何调用的方法没生效?

ynopeeb · 2015年10月14日 · 最后由 cassiuschen 回复于 2015年10月14日 · 1932 次阅读

场景:将一个包含很多二级域名的文件,解析出来第一条记录。以谷歌地图为例,格式化的输出 map.google.com maps

~ dig map.google.com

;; ANSWER SECTION:
map.google.com.     2400    IN  CNAME   maps.google.com.
maps.google.com.    299 IN  A   216.58.221.110

代码:

# /usr/bin/ruby -w
# coding:utf-8
# dig the domain banding in UPYUN
# https://github.com/bluemonk/net-dns

require 'net/dns'

# 将给定的 url dig 出来 answer 里的第一条解析记录
def dig_dns(url)
    packet = Net::DNS::Resolver.start("#{url}")
    r = packet.answer[0].to_s.split(" ")
    print "#{r[0].to_s.chop}  " "#{r[4].to_s.split(".")[0]}\n"
end

# 将泛域名里面的 * 替换成 test,以符合域名解析规则
def subt(str)
    if str.include? '*'
        puts str.sub('*','upyun')
    else
        puts str
    end
end

# 包含域名的文件作为参数输入
filename = ARGV[0]

# 遍历文件中的 url,然后格式化的输出
File.open(filename,'r+') do |f|
  f.each do |line|
    line.split(" ").each {|s| 
        dig_dns(subt(s))
    }
  end
end

疑问:在最后一个部分 dig_dns(subt(s))dig_dns 方法没有生效,结果输出的还是单个 url,请问问题出在哪里呢?

调试了一下,发现调用了,但是只调用了前半句,后半句没执行,语法问题?

只执行前一句应该是你的错觉,你可以试试调用

x = subt('123')
puts x

x 返回出来的是空,传入到 dig_dns 的参数为空。

#2 楼 @king1990_cool 我刚测试了,确实为空,为啥呢,没搞明白。subt('123'') 的返回值应该是字符串,把字符串赋给一个变量,然后输出,应该还是字符串本身才对吧。设计了一个验证的方法对比下:

irb(main):001:0> def test(x)
irb(main):002:1> x = x + 1
irb(main):003:1> end
=> nil
irb(main):004:0> test(3)
=> 4
irb(main):005:0> t = test(3)
=> 4
irb(main):006:0> puts t
4
=> nil
irb(main):007:0>

#2 楼 @king1990_cool 我吧 subt() 方法里的两个 puts 去掉,程序通了...

#4 楼 @ynopeeb putsprint之类的方法返回值都是空,subt是要处理字符串而不是打印出来故不能用puts返回值……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号