- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我主要使用 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")
而我实际上在源代码中根本找不到对它的任何引用的
我一定在这里遗漏了一些东西,rb_f_gsub
的源代码发生了变化,实际上是从 1.8.7 中的 string.c
移动到了 ruby.c
在 1.9.3 中,介于两者之间。
有了这一切,我认为,我们可以回答最初的问题,即为什么我们需要它 - 我想我们不需要,至少现在不需要。
所以现在的问题是,它何时实际使用过以及如何使用?
关于ruby - 何时在 Ruby 中使用 Kernel#gsub?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832023/
我正在编写一个程序,它将从 who 命令中提取信息并格式化输出。 普通 who 命令: user ip date (ip) user ip date (ip) user ip date (ip) us
我有一个包含以下数据的文件- 输入- A B C D E F A B B B B B C A C D E F A B D E F A A A A A A F A B C B B B 如果从第 2 行开
这个问题在这里已经有了答案: How to prevent regmatches drop non matches? (4 个回答) 5年前关闭。 我正在浏览一个字符向量(大约 10,000 个条目)
我想连续生成一个Employee_ID,我已经在数据库表中修复了一个初始员工ID。格式为“E36162000”,我从表中获取最后一个员工 ID,然后仅提取整数值,然后加一,这将是下一个 employe
使用以下函数,我转到一个站点,抓取一些信息,返回一些 JSON,并将其放入 @price 实例变量中。 返回给我的 JSON 是一个数字,但是如果数字大于 1000,那么数字将包含一个逗号,所以我将其
我在运行脚本时不断收到此错误。我对 Ruby 很陌生,所以请原谅我的傲慢。 我正在使用内置了 JRuby 支持的 Nuix 编写脚本。 这是我的代码; require 'benchmark' requ
我在 R 中工作,并且仅在没有左括号时才尝试删除右括号。我在下面尝试过,但没有返回所需的输出。 test <- data.frame(t1 = c("Book (Pg 1)", "Website On
我正在尝试从 Chandler 中删除标点符号和数字成为Chandler .这是我目前正在尝试的: df$city <- gsub("[[:punct:]]|[[:digit:]]", "", df$
我正在尝试生成结合 n 个高斯的函数,并使用从 nls 中检索到的值跑。我用 gsub用 nls 替换原始系数那些使用反向引用的。然而,似乎[在 \\1 之前对 datafame 进行评估. 这是一个
这个问题在这里已经有了答案: What regex will match every character except comma ',' or semi-colon ';'? (4 个回答) 5年前
我有一个日志数据集: V1 duration id startpoint T161[=]Pexplorer.exe[=]I1820[=]W20094[=]V6.00.2900.5512 777
我正在使用 local mystring = 'Thats a really nice house.' string.gsub(mystring,"% ", "/",1) 用斜杠替换第一个空格字符。
我有一些正在使用的 html 代码。我想提取某些字符串。 我想使用 从字符串 x 中提取它的首选基础 R :coleman_l, SMOG4 这是我所拥有的: x (hi)auto(coleman_l
我希望这是足够不同的相关,之前的帖子来证明它自己的线程是合理的;不幸的是,他们对我没有帮助。我认为我对部分替换的兴趣,加上通配符的使用迄今为止是独一无二的,但如果我只是没有足够仔细地搜索或阅读,我深表
我有一个字符串"ab b cde",即"ab[space]b[space]cde"。我想用空格替换“space-b”和“space-c”,以便输出字符串为"ab[space][space][space
我正在尝试清理一些文本字符串,以便我可以干净地解析出一些脚本信息。对于这些表格,括号中的信息表示脚本的位置或阻塞注释。 我想获取所有括号内的信息,并删除括号及其所有包含的字符。工作中的关键在于,由于数
任何人都可以通过 gsub 帮助实现以下目标在R? input string: a=5.00,b=120,c=0.0003,d=0.02,e=5.20, f=1200.0,g=850.02 desir
给定字符串: smple_paths <- c("/path/path/path/abc22/path/path", "/apath/apath/paath/abc1
似乎当我添加一个特殊字符时 gsub 不再适合我。 我如何使用带有此类字符的文本 print(string.gsub("a !foo walking", "%a+",{ ["!foo"] =
我有一批样本要提交给我的大学集群进行处理。我有超过 1000 个样本需要运行。不必手动创建脚本,我想知道我可以制作一个 for 循环来替换示例 ID。每个脚本本质上是相同的,我只需要更改示例 ID 和
我是一名优秀的程序员,十分优秀!