当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Kernel.open用法及代码示例


本文简要介绍ruby语言中 Kernel.open 的用法。

用法

open(path [, mode [, perm]] [, opt]) → io or nil
open(path [, mode [, perm]] [, opt]) {|io| block } → obj

创建一个连接到给定流、文件或子进程的 IO 对象。

如果 path 不以竖线字符 ( | ) 开头,则将其视为要使用指定模式打开的文件的名称(默认为 “r”)。

mode 是字符串或整数。如果是整数,则必须是bitwise-or of open(2) 标志,例如 File::RDWR 或 File::EXCL。如果是字符串,则为 “fmode”、“fmode:ext_enc” 或 “fmode:ext_enc:int_enc”。

有关mode 字符串指令的完整文档,请参阅 IO.new 的文档。

如果正在创建文件,则可以使用perm 参数设置其初始权限。有关权限的说明,请参见 File.new 以及 open(2) 和 chmod(2) 手册页。

如果指定了一个块,它将以 IO 对象作为参数调用,当块终止时 IO 将自动关闭。该调用返回块的值。

如果 path 以管道字符 ("|" ) 开头,则创建一个子进程,通过一对管道连接到调用者。返回的 IO 对象可用于写入标准输入并从此子进程的标准输出中读取。

如果管道后面的命令是一个减号("|-"),Ruby fork,并且这个子进程连接到父进程。如果命令不是 "-" ,则子进程运行该命令。请注意,如果该命令包含 shell 元字符,则该命令可能会被 shell 处理。

当子进程是 Ruby(通过 "|-" 打开)时,open 调用返回 nil。如果一个块与 open 调用相关联,则该块将运行两次——一次在父项中,一次在子项中。

块参数将是父对象中的 IO 对象和子对象中的nil。父对象的IO 对象将连接到子对象的 $stdin 和 $stdout。子进程将在块的末尾终止。

例子

从 “testfile” 读取:

open("testfile") do |f|
  print f.gets
end

产生:

This is line one

打开一个子进程并读取其输出:

cmd = open("|date")
print cmd.gets
cmd.close

产生:

Wed Apr  9 08:56:31 CDT 2003

打开一个运行相同 Ruby 程序的子进程:

f = open("|-", "w+")
if f.nil?
  puts "in Child"
  exit
else
  puts "Got: #{f.gets}"
end

产生:

Got: in Child

使用块打开子进程以接收 IO 对象:

open "|-" do |f|
  if f then
    # parent process
    puts "Got: #{f.gets}"
  else
    # child process
    puts "in Child"
  end
end

产生:

Got: in Child

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Kernel.open。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。