gpt4 book ai didi

ruby - 何时在 Ruby 中使用 Kernel#gsub?

转载 作者:数据小太阳 更新时间:2023-10-29 08:47:39 25 4
gpt4 key购买 nike

我主要使用 String#gsub .我也很熟悉。还有一个Kernel#gsub我从未使用过。

我尝试如下探索:

(arup~>~)$ echo 'matz' | ruby -n -e 'puts $_.gsub(/./,"*")'
****
(arup~>~)$ echo 'matz' | ruby -n -e '$_.gsub(/./,"*") ; puts $_'
matz
(arup~>~)$ echo 'matz' | ruby -np -e '$_.gsub(/./,"*")'
matz

文档说 - 等同于 $_.gsub,除了 $_ 将在替换发生时更新。但在我的例子中,似乎 $_ 还没有更新。

原因是 String#gsub 被调用了。不是 Kernel#gsub。见下文:

(arup~>~)$ echo 'matz' | ruby -n -e 'p $_.method(:gsub)'
#<Method: String#gsub>
  • 如何调用Kernel#gsub

  • 为什么我们需要这个方法,而我们有 String#gsub

我在 Ruby Forum 中问过同样的问题, 但没有得到任何答复。

最佳答案

使用您在上面使用的相同示例应该可以说明这一点:

使用 Kernel.gsub

echo 'matz' | ruby -np -e 'puts "before: " + $_; Kernel.gsub(/./,"*"); puts "after: " + $_'
# -> before: matz
# -> after: ****

并使用 $_.gsub

echo 'matz' | ruby -np -e 'puts "before: " + $_; $_.gsub(/./,"*"); puts "after: " + $_'
# -> before: matz
# -> after: matz

如您所见,$_ 仅在使用 Kernel.gsub 时更新

编辑:

一些额外的信息,在我这边加入了一些假设

取自ruby source $_ 的描述性别名是 $LAST_READ_LINE。这是创建别名的内联注释所说的:

The last line read by Kernel.gets or Kernel.readline. Many string-related functions in the +Kernel+ module operate on $_ by default. The variable is local to the current scope. Thread local.

现在根据最终作为 Kernel#gsub 提供的 c 代码(在 string.c 中定义)

static VALUE
rb_f_gsub(int argc, VALUE *argv)
{
VALUE str = rb_funcall_passing_block(uscore_get(), rb_intern("gsub"), argc, argv);
rb_lastline_set(str);
return str;
}

此代码在字符串上使用内部 gsub 方法,然后在返回变异字符串本身之前将 $_ 显式分配给新值。

我能想出的唯一原因是 Kernel#gsub 会在内部用于某种总是的输入预清理。作为一种方便的排序方法,立即将经过清理的值分配给 $_ 以供进一步使用,而无需显式分配和返回 $_

我是说会是,因为事实证明 ruby​​ 1.9.1 的变更日志将 Kernel#gsub 列为已弃用

  • Deprecation

    o Kernel#getc, #gsub, #sub

Kernel#gsub 在 c 中的用法是 rb_intern("gsub") 而我实际上在源代码中根本找不到对它的任何引用的

  • 1.8.7p371
  • 1.8.0
  • 1.7.1
  • 1.6.0
  • 1.3.1
  • 1.0.0

我一定在这里遗漏了一些东西,rb_f_gsub 的源代码发生了变化,实际上是从 1.8.7 中的 string.c 移动到了 ruby.c 在 1.9.3 中,介于两者之间。

有了这一切,我认为,我们可以回答最初的问题,即为什么我们需要它 - 我想我们不需要,至少现在不需要。

所以现在的问题是,它何时实际使用过以及如何使用?

关于ruby - 何时在 Ruby 中使用 Kernel#gsub?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com