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

时间:2009-06-16 10:30:34

标签: ruby string

这就是我现在所拥有的 - 它对于正在进行的工作看起来过于冗长。

@title        = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?

假设标记是通过分割CSV线获得的数组。 现在像条带的功能!的Chomp!等。如果字符串未被修改,则返回nil

"abc".strip!    # => nil
" abc ".strip!  # => "abc"

如果Ruby包含额外的前导空格或尾随空格而不创建副本,那么修改它的方法是什么?

如果我想tokens[Title].chomp!.strip!

,那就更加丑陋了

9 个答案:

答案 0 :(得分:253)

我想你想要的是:

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

如果#strip!方法没有删除任何内容,{{3}}方法将返回nil,如果它被剥离,则返回变量本身。

根据Ruby标准,后缀为感叹号的方法会更改变量。

希望这有帮助。

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

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

答案 1 :(得分:49)

顺便说一下,现在红宝石已经支持只带条而没有“!”。

比较

p "abc".strip! == " abc ".strip!  # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip    # true

如果没有重复,strip也是不可能的。请参阅string.c中的源代码:

static VALUE
rb_str_strip(VALUE str)
{
    str = rb_str_dup(str);
    rb_str_strip_bang(str);
    return str;
}

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

更新1: 正如我现在看到的 - 它创建于1999年(参见SVN中的rev #372):

UPDATE2: strip!不会创建重复项 - 包括1.9.x,2.x和trunk版本。

答案 2 :(得分:8)

没有必要同时剥离和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

作为替代方案,如果您有冒险精神,可以在String本身上定义一个方法:

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!

答案 3 :(得分:7)

如果您使用Ruby on Rails,则会出现 squish

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

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

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

如果您只使用Ruby,则需要使用 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"

答案 4 :(得分:2)

我认为你的例子是一种明智的方法,尽管你可以稍微简化一下:

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

替代方案你可以把它放在两行:

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

答案 5 :(得分:2)

如果您想在需要之后使用其他方法:

float f;
int a = (int) f;
String res = null;
if (a<100) res = String.format("%.2f");
else if (a<1000) res = String.format("%.1f");
else res = String.valueOf(a);

通过这种方式,您可以在以下情况下剥离并仍然执行某些操作:)

答案 6 :(得分:1)

我的方式:

> (@title = " abc ").strip!
 => "abc" 
> @title
 => "abc" 

答案 7 :(得分:1)

如果你有ruby 1.9或activesupport,你可以做到

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

这非常酷,因为它利用了:try:tap方法,我认为这是ruby中最强大的功能构造。

一种更可靠的形式,将函数完全作为符号传递:

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

答案 8 :(得分:-1)

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

完全有可能我不理解这个话题,但这不会做你需要的吗?

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