Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么要将File.expand_path(File.dirname(File.dirname(_File__)))放在一起给我不同的结果?_Ruby - Fatal编程技术网

Ruby 为什么要将File.expand_path(File.dirname(File.dirname(_File__)))放在一起给我不同的结果?

Ruby 为什么要将File.expand_path(File.dirname(File.dirname(_File__)))放在一起给我不同的结果?,ruby,Ruby,在Win7上使用ruby 2.0.0p481(2014-05-08)[x64-mingw32] 在一个目录中(d:\download\ruby),我有两个文件——calling.rb和called.rb 呼叫.rb require_relative 'called' print_path() def print_path() puts "File.expand_path(File.dirname(__FILE__)) is #{File.expand_path(File.dirname(_

在Win7上使用ruby 2.0.0p481(2014-05-08)[x64-mingw32]

在一个目录中(
d:\download\ruby
),我有两个文件——calling.rb和called.rb

呼叫.rb

require_relative 'called'
print_path()
def print_path()
  puts "File.expand_path(File.dirname(__FILE__)) is #{File.expand_path(File.dirname(__FILE__))}"
  puts "File.expand_path(File.dirname(File.dirname(__FILE__))) is #{File.expand_path(File.dirname(File.dirname(__FILE__)))}"
  puts File.expand_path(File.dirname(__FILE__))
end
print_path()
调用.rb

require_relative 'called'
print_path()
def print_path()
  puts "File.expand_path(File.dirname(__FILE__)) is #{File.expand_path(File.dirname(__FILE__))}"
  puts "File.expand_path(File.dirname(File.dirname(__FILE__))) is #{File.expand_path(File.dirname(File.dirname(__FILE__)))}"
  puts File.expand_path(File.dirname(__FILE__))
end
print_path()
有人能解释一下为什么直接调用.rb时

d:\download\ruby>ruby called.rb
File.expand_path(File.dirname(__FILE__)) is d:/download/ruby
File.expand_path(File.dirname(File.dirname(__FILE__))) is d:/download/ruby
d:/download/ruby
使用与calling.rb相同的代码时会产生不同的结果

d:\download\ruby>ruby calling.rb
File.expand_path(File.dirname(__FILE__)) is d:/download/ruby
File.expand_path(File.dirname(File.dirname(__FILE__))) is d:/download
d:/download/ruby
File.expand_path(File.dirname(__FILE__)) is d:/download/ruby
File.expand_path(File.dirname(File.dirname(__FILE__))) is d:/download
d:/download/ruby

d:\download\ruby>

因为
\uuuuu FILE\uuuuu
是当前源文件名,“current”是此处的关键字

您还将获得嵌套中某个目录的目录名

要解决此问题,以下几行可能会有所帮助:

def print_path()
  puts "File.expand_path(File.dirname(__FILE__)) is #{File.expand_path(File.dirname(__FILE__))}"
  puts "File.expand_path(File.dirname(File.dirname(__FILE__))) is #{File.expand_path(File.dirname(File.dirname(__FILE__)))}"
  puts File.expand_path(File.dirname(__FILE__))
end

你做的一切都很完美,结果也是正确的。这里唯一值得注意的是

  • 当执行调用的.rb时,print_path()只执行一次
  • 但是当您执行
    calling.rb
    时,print_path()执行了两次。因为您需要调用.rb中的整个文件called.rb。因此,首先执行被调用的.rb文件的print\u path()方法,然后再次执行调用的.rb文件的print\u path()方法
  • 这就是为什么您两次收到相同结果的原因。对于相同的结果案例,您将两个文件放在同一目录中。这就是为什么在
    print\u path()
    执行中的结果也相同


    如果将上述文件中的任何一个放在不同的目录下,您将得到不同的结果。

    要跟踪
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。然后,您将看到当前文件是什么,以及
    \uuuuu file\uuuu
    变量如何表示它。您能建议在何处以及使用什么来调试吗?我要说的是,我使用的
    put
    足够好,可以看到发生了什么。我的示例的最后一行是非嵌套的,但在疑难解答中显示了两种方法,将行放在上面。明白了。我从某个地方复制了代码,要么错误地嵌套了它,要么就是这样。谢谢你的解释。但是嵌套没有解释为什么,当直接执行called.rb时,我在所有3行中得到相同的路径。-我更新了我的问题。我使用了你的调试行并添加了结果。@vgoff,这里没什么错,Radek唯一使用斜杠的地方是在他的提示符和解释中,他在windows机器上显示了文件运行的路径,并且在windows机器上进行了更正Ruby puts的输出在每个操作系统中都是正向斜杠,欢迎来到windows world of 8>)命令行提示现在更加清晰,输出之间的分隔也更加清晰。