在Ruby中修剪字符串而不创建新字符串的规范方法是什么?

在Ruby中修剪字符串而不创建新字符串的规范方法是什么?,ruby,string,Ruby,String,这就是我现在所拥有的——对于它正在做的工作来说,它看起来太冗长了 @title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil? 假设令牌是通过拆分CSV行获得的数组。 现在的功能像条带!咬!如果未修改字符串,则返回nil "abc".strip! # => nil " abc ".strip! # => "abc" 如果它包含额外的前导或尾随空格而不创建副本,Ruby怎么说修剪它呢

这就是我现在所拥有的——对于它正在做的工作来说,它看起来太冗长了

@title        = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
假设令牌是通过拆分CSV行获得的数组。 现在的功能像条带!咬!如果未修改字符串,则返回nil

"abc".strip!    # => nil
" abc ".strip!  # => "abc"
如果它包含额外的前导或尾随空格而不创建副本,Ruby怎么说修剪它呢


如果我想做
tokens[Title].chomp!会变得更丑!。脱衣舞

我想你想要的是:

@title = tokens[Title]
@title.strip!
如果没有剥离任何内容,该方法将返回
nil
,如果剥离,则返回变量本身

根据Ruby标准,带有感叹号后缀的方法会在适当的位置更改变量

希望这有帮助

更新:这是从
irb
输出的,用于演示:

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"

我认为您的示例是一种明智的方法,尽管您可以将其稍微简化为:

@title = tokens[Title].strip! || tokens[Title] if tokens[Title]
或者,您可以将其放在两行:

@title = tokens[Title] || ''
@title.strip!

没有必要同时进行strip和chomp,因为strip还将删除尾随的回车符,除非您更改了默认的记录分隔符,而这正是您要执行的操作

Olly的答案在Ruby中已经有了实现这一点的标准方法,不过如果你发现自己经常这样做,你可以为它定义一个方法:

def strip_or_self!(str)
  str.strip! || str
end
给予:

@title = strip_or_self!(tokens[Title]) if tokens[Title]
还要记住,如果令牌为nil,if语句将阻止
@title
被赋值,这将导致它保留其以前的值。如果您希望或不介意始终分配
@title
,您可以将支票移动到方法中,进一步减少重复:

def strip_or_self!(str)
  str.strip! || str if str
end
或者,如果您觉得有冒险精神,可以在字符串本身上定义一个方法:

class String
  def strip_or_self!
    strip! || self
  end
end
提供下列其中一项:

@title = tokens[Title].strip_or_self! if tokens[Title]

@title = tokens[Title] && tokens[Title].strip_or_self!

顺便说一句,现在ruby已经支持不带“!”的strip了

比较:

p "abc".strip! == " abc ".strip!  # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip    # true
此外,如果没有重复项,
也不可能剥离
。请参阅string.c中的源代码:

ruby 1.9.3p0(2011-10-30)[i386-mingw32]

更新1: 正如我现在看到的——它创建于1999年(见SVN):

更新2:
strip
不会创建重复项-无论是1.9.x、2.x还是trunk版本。

我的方式:

> (@title = " abc ").strip!
 => "abc" 
> @title
 => "abc" 
我完全有可能不理解这个话题,但这不符合你的需要吗

" success ".strip! || "rescue" #=> "success"
"failure".strip! || "rescue" #=> "rescue"

如果您有ruby 1.9或activesupport,您可以简单地执行以下操作

@title = tokens[Title].try :tap, &:strip!
这真的很酷,因为它利用了
:try
:tap
方法,在我看来,这是ruby中最强大的函数构造

一种更为可爱的形式,传递的功能完全是符号:

@title = tokens[Title].send :try, :tap, &:strip!

如果您使用的是Ruby on Rails,则会出现挤压

> @title = " abc "
 => " abc " 

> @title.squish
 => "abc"
> @title
 => " abc "

> @title.squish!
 => "abc"
> @title
 => "abc" 
如果您只使用Ruby,则需要使用strip

这就是问题所在。。在你的情况下,你想使用无爆炸带

脱衣舞!当然返回nil,如果没有操作,它仍然更新变量,所以strip!不能内联使用。如果你想使用带内联,你可以使用没有爆炸的版本

脱衣舞使用多行方法

> tokens["Title"] = " abc "
 => " abc "
> tokens["Title"].strip!
 => "abc"
> @title = tokens["Title"]
 => "abc"
条带式单线进近。。。你的回答

> tokens["Title"] = " abc "
 => " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
 => "abc"

如果在需要以下内容后要使用其他方法:

( str.strip || str ).split(',')

这样你就可以脱光衣服,在:)之后仍然做一些事情。

Hmm。。我仍然认为@title=tokens[title].strip!看起来更干净-很遗憾它返回nil而不是未修改的字符串。除非有人发布更好的答案。。你得到了被接受的位。好的,@title=tokens[title]。strip会起作用,但是你会有一个副本,如果你保持tokens[title]变量不变,这是很好的。Ruby 1.9有tap,它完全可以做你想要的:@title.tap{x | x.strip!}@timkay是否可以做
@title.tap&:strip?这看起来比其他任何东西都干净。为什么它会返回
nil
,除非它去除了某些东西?毫无疑问,这让很多人感到困惑(因为这毫无意义)。如果你要反复从代币中读取内容,那么对其进行预处理可能更有意义。也就是说,“tokens.each{| t | t.strip!}”。然后你可以只做“@title=tokens[title]| | |”“如果没有副本,剥离是不可能的”-当然这是可能的,这就是
剥离
是为@KarolyHorvath编写的,您没有看到用C编写的源代码吗?请仔细阅读,我在这里写的关于副本的内容。我当然看到了。但这是
strip
的源代码。我是不是误解了什么?否则我怎么解释“没有复制就不可能剥离”@KarolyHorvath内部复制总是被创建的。这是关于字符串'str=rb_str_dup(str)`如果你不想复制,你可以使用
strip
aka
rb\u str\u strip\u bang
> tokens["Title"] = " abc "
 => " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
 => "abc"
( str.strip || str ).split(',')