新手问题 ruby 中 == ?. 的用法解释

kooder · 2017年09月07日 · 最后由 kooder 回复于 2017年09月08日 · 2469 次阅读

请教以下代码块中的

if File.basename(path)[0] == ?.

表示什么意思?谢谢。

Find.find(searchpath) do |path|
   if FileTest.directory?(path)
     if File.basename(path)[0] == ?.
       Find.prune       # Don't look any further into this directory.
     else
       next
     end
   end

代码出处链接 https://www.ibm.com/developerworks/aix/library/au-rubysysadmin/index.html

chenge 回复

谢谢指点! 关于这样的用法?. 在哪里有文档说明吗?

试了一下的确这样,不知道什么黑魔法。。。

pynix 回复

试了下原帖里的代码,即便把下面这段都去掉,也不会影响运行结果😅 所以很难确定 ?. 就等同于 "."😨 :

if File.basename(path)[0] == ?.
  Find.prune       # Don't look any further into this directory.
else
  next
end

原帖代码

require 'find'
puts ""
puts "-----------------------File Search-----------------------------------"
puts ""
print "Enter the search path    : "
searchpath = gets
searchpath = searchpath.chomp
puts ""
print "Enter the search pattern : "
pattern = gets
pattern = pattern.chomp
puts"----------------------------------------------------------------------"
puts "Searching in " + searchpath + " for files matching pattern " + pattern
puts"----------------------------------------------------------------------"
puts ""
 Find.find(searchpath) do |path|
   if FileTest.directory?(path)
     if File.basename(path)[0] == ?.
       Find.prune       # Don't look any further into this directory.
     else
       next
     end
   else
     if File.fnmatch(pattern,File.basename(path))
       puts  "Filename     : " +  File.basename(path)
       s = sprintf("%o",File.stat(path).mode)
       print "Permissions  : "
       puts s
       print "Owning uid   : "
       puts File.stat(path).uid
       print "Owning gid   : "
       puts File.stat(path).uid
       print "Size (bytes) : "
       puts File.stat(path).size
       puts "---------------------------------------------------"
     end
   end
 end

简单啊,irb 实验下就知道了

Ruby 中问号接着单个字母或者符号不是代表字符吗,就是类似于 c 中的单引号用法。

所以 ?. 就是 "." 吧,因为 Ruby 里好像没有区分字符和字符串

kooder 回复

就是单个字符的字符串,没什么“很难确定”的。顺便这是我四年前的同样主题的帖:https://ruby-china.org/topics/11052

即便把下面这段都去掉,也不会影响运行结果

如果你还在初学编程(或者任何一门知识)的阶段,不要有这种“我试着改一下看看这个黑盒能出什么结果”的态度,而是要改成“我现在接触的都是皮毛,所以肯定有人 / 文档能完整解答”的态度。

5long 回复

就是想找在哪里定义了这种用法。无奈不知从何下手,多谢指点! 顺便问一下,为何将#4 里的那段代码删除,也不会影响运行结果?每个目录下应该都有 . 目录的呀。

kooder 回复

就这个特例来说,在不知道语法定义的前提下,自己去探索的难度太大(因为一个问号加一个句点,绝大多数搜索引擎都不知道该怎么索引才好,一般都会在 normalize 的过程中清洗掉)。

来论坛直接提问就是更干脆的方案,而且一楼也有回答,先记住就行了。在知道了这是“单个字符串的字面量的语法”之后,可以在 http://ruby-doc.com/ 上搜索 literal(“字面量”的英文原文)或者 string literal(“字符串字面量”) ,尝试找到官方文档的解释。不过还是因为难于索引的缘故,只能点进搜索结果一行行地细读。

5long 回复

特别欣赏这种授之以渔的解答👍 那行代码里的意思是寻找以 . 开头的 directory,那么 . 目录(当前目录)能被搜到吗?还是一定要 . 开头的有名字的目录,比如 .dir_a。

kooder 回复

可以用这个比较笨拙但有效的办法试试看:

if File.basename(path)[0] == ?.
  puts "HAZDOT: " + path # 加入这一行,当某些文件夹的名字满足你的假设条件,就会打印出来
  Find.prune       # Don't look any further into this directory.
else
  next
end

然后运行程序来验证你的假设就行了。

?在 1.8 的时候是用来查字符的 ascii 码的,?x 相当于'x'.ord 这样,在 1.9 之后就变成返回单个字符本身了,一般很少会这么用。。

5long 回复

经过验证,这段代码是查找类似 .dir_a 这样的以 dot 开头且跟有名字的目录,而对 . 目录本身不起作用。

谢谢给位的指点!

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