为什么要使用本机函数而不是系统调用?
Why should native functions be used instead of system calls?
代码审阅者要求对类似于以下的一段代码进行更改:
system("grep foo /tmp/bar")
或者这个:
res, err, st = Open3.capture3("grep foo /tmp/bar")
审稿人说:
Just read the file natively in Ruby, no need to fork a sub-command.
为什么审阅者认为使用 Ruby 的本机函数更好,例如 File.read
,即使在子命令调用中没有不受信任的数据?
最好的办法显然是询问审稿人,而不是我们。但我可以推测。
- 调用子 shell 效率较低,简单明了。它需要一个额外的进程,而
File.read
在当前进程中运行。
- 您的密码现在是 OS-dependent。例如,Windows 没有
grep
命令,但是 File.read
可以在任何运行 Ruby. 的 OS 上运行
- 乍看之下,一个子shell让我觉得发生了一些有趣的事情。如果我看到
File.read
,我希望它出现在 Ruby 代码中。如果我看到一个 system
调用,我开始怀疑发生了一些奇怪的事情,使我怀疑代码的性质。
无论如何,在 Ruby 中进行 grepping 仍然非常简单。其实字面意思就是grep
.
File.readlines("/tmp/bar").grep(/foo/)
如果我在代码审查中遇到问题中的 grep
代码,我可能会出于上述原因标记它。
代码审阅者要求对类似于以下的一段代码进行更改:
system("grep foo /tmp/bar")
或者这个:
res, err, st = Open3.capture3("grep foo /tmp/bar")
审稿人说:
Just read the file natively in Ruby, no need to fork a sub-command.
为什么审阅者认为使用 Ruby 的本机函数更好,例如 File.read
,即使在子命令调用中没有不受信任的数据?
最好的办法显然是询问审稿人,而不是我们。但我可以推测。
- 调用子 shell 效率较低,简单明了。它需要一个额外的进程,而
File.read
在当前进程中运行。 - 您的密码现在是 OS-dependent。例如,Windows 没有
grep
命令,但是File.read
可以在任何运行 Ruby. 的 OS 上运行
- 乍看之下,一个子shell让我觉得发生了一些有趣的事情。如果我看到
File.read
,我希望它出现在 Ruby 代码中。如果我看到一个system
调用,我开始怀疑发生了一些奇怪的事情,使我怀疑代码的性质。
无论如何,在 Ruby 中进行 grepping 仍然非常简单。其实字面意思就是grep
.
File.readlines("/tmp/bar").grep(/foo/)
如果我在代码审查中遇到问题中的 grep
代码,我可能会出于上述原因标记它。