Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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和Net::SFTP:为什么可以';我不能把它移到一个单独的函数吗?_Ruby_Net Sftp - Fatal编程技术网

Ruby和Net::SFTP:为什么可以';我不能把它移到一个单独的函数吗?

Ruby和Net::SFTP:为什么可以';我不能把它移到一个单独的函数吗?,ruby,net-sftp,Ruby,Net Sftp,编写一个函数,通过SFTP检查服务器上是否存在文件 我已经编写了一个函数sftp\u file\u exists\u 1?,可以正常工作。现在我想把这个函数分成两个函数,让我惊讶的是,这个函数不起作用 要求“净/sftp” def sftp_文件_存在_1?(主机、用户、文件名) Net::SFTP.start(主机、用户、验证_主机_密钥::始终)do | SFTP| sftp.stat(文件名)do |响应| 回复,好吗? 结束 结束 结束 def sftp_stat_ok?(sftp,文件

编写一个函数,通过SFTP检查服务器上是否存在文件

我已经编写了一个函数
sftp\u file\u exists\u 1?
,可以正常工作。现在我想把这个函数分成两个函数,让我惊讶的是,这个函数不起作用

要求“净/sftp”
def sftp_文件_存在_1?(主机、用户、文件名)
Net::SFTP.start(主机、用户、验证_主机_密钥::始终)do | SFTP|
sftp.stat(文件名)do |响应|
回复,好吗?
结束
结束
结束
def sftp_stat_ok?(sftp,文件名)
sftp.stat(文件名)do |响应|
回复,好吗?
结束
结束
def sftp_文件_存在_2?(主机、用户、文件名)
Net::SFTP.start(主机、用户、验证_主机_密钥::始终)do | SFTP|
返回sftp_stat_ok?(sftp,文件名)
结束
结束
p sftp文件1(“本地主机”、“用户”、“repos”)
p sftp文件2(“本地主机”、“用户”、“repos”)
我期望:

true
true
因为服务器上实际存在文件
repos
。但是,我得到(缩写):

有趣的问题

旧式调试 让我们添加一些
put
,看看会发生什么:

require "net/sftp"

def sftp_file_exists_1?(host, user, filename)
  Net::SFTP.start(host, user, verify_host_key: :always) do |sftp|
    puts "  BEFORE STAT"
    sftp.stat(filename) do |response|
      puts "  REQUEST FINISHED"
      return response.ok?
    end
    puts "  AFTER STAT"
  end
  puts "  NOT EXECUTED"
end

def sftp_stat_ok?(sftp, filename)
  request = sftp.stat(filename) do |response|
    puts "  REQUEST FINISHED"
    return response.ok?
  end
  puts "  REQUEST SENT"
  request
end

def sftp_file_exists_2?(host, user, filename)
  Net::SFTP.start(host, user, verify_host_key: :always) do |sftp|
    puts "  CALL STAT_OK?"
    return sftp_stat_ok?(sftp, filename)
  end
  puts "  NOT EXECUTED"
end
sftp\u文件\u存在\u 1?
输出:

  BEFORE STAT
  AFTER STAT
  REQUEST FINISHED
true
  CALL STAT_OK?
  REQUEST SENT
#<Net::SFTP::Request:0x0000000001db2558>
sftp\u文件\u存在时\u 2?
输出:

  BEFORE STAT
  AFTER STAT
  REQUEST FINISHED
true
  CALL STAT_OK?
  REQUEST SENT
#<Net::SFTP::Request:0x0000000001db2558>
第一个版本不需要它,因为:

如果给出了一个块,它将被传递给SFTP会话,并将被删除 在SFTP会话完全打开并初始化后调用。当 块终止时,新的SSH会话将自动关闭


谢谢我昨天开始使用Ruby,似乎我误解了函数/块的构造。我以为调用了函数,然后调用了块。现在我明白这不是真的了。@LasseKliemann:这个例子也让我感到惊讶,尽管我已经使用Ruby很长时间了。一开始它看起来很奇怪,因为它是异步的。一个块可以执行任意次数(包括0)和任意时间,具体取决于该方法执行的操作。文档帮助很大!