Ruby on rails 这个C到Ruby的最干净的端口是什么?
我正在将逗号分隔的字符串解析为数组。在C中,我有:Ruby on rails 这个C到Ruby的最干净的端口是什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在将逗号分隔的字符串解析为数组。在C中,我有: var someArray = someString.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var something in someArray) { SomeList.Add(something.Trim().ToLower()); } 以下是我到目前为止在Ruby中使用Rails的内容。blank s
var someArray = someString.Split(
new char[] { ',' },
StringSplitOptions.RemoveEmptyEntries);
foreach (var something in someArray)
{
SomeList.Add(something.Trim().ToLower());
}
以下是我到目前为止在Ruby中使用Rails的内容。blank
some_array = some_string.split(',').each { |something| something.strip.downcase }
some_array.delete_if { |something| something.blank? }
有没有更干净的方法
some_string.split(',').map(&:strip).map(&:downcase).reject(&:empty?)
这将创建三个中间数组,并遍历所有三个中间数组,但我通常不会担心这一点,除非您能够通过性能分析证明这是一个严重的瓶颈
否则你就得做类似的事情
some_string.split(',').inject([]) {|ary, str|
ary.tap { unless (str = str.strip.downcase).empty? then ary << str end }
}
旁注:我可能写的C代码更像这样:
var someList = new List<string>(
from s in someString.Split(
new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
select s.Trim().ToLower());
这将创建三个中间数组,并遍历所有三个中间数组,但我通常不会担心这一点,除非您能够通过性能分析证明这是一个严重的瓶颈
否则你就得做类似的事情
some_string.split(',').inject([]) {|ary, str|
ary.tap { unless (str = str.strip.downcase).empty? then ary << str end }
}
旁注:我可能写的C代码更像这样:
var someList = new List<string>(
from s in someString.Split(
new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
select s.Trim().ToLower());
a您编写的代码没有达到预期效果。您可以调用.each并对字符串调用非变异方法。因此,您的some_数组与some_string.split','相同 b我个人会这样做:
arr = str.split(',').map{ |s| s.blank? ? nil : s.strip.downcase }.compact
这将创建一个可能包含nil项的数组,然后使用compact将其删除。但是,如果绝对速度至关重要,这将更快:
arr = []
str.split(',').each do |s|
arr << s.strip.downcase unless s.blank?
end
编辑:修改代码,将.strip.downcase延迟到空白测试之后。a您编写的代码没有达到预期效果。您可以调用.each并对字符串调用非变异方法。因此,您的some_数组与some_string.split','相同 b我个人会这样做:
arr = str.split(',').map{ |s| s.blank? ? nil : s.strip.downcase }.compact
这将创建一个可能包含nil项的数组,然后使用compact将其删除。但是,如果绝对速度至关重要,这将更快:
arr = []
str.split(',').each do |s|
arr << s.strip.downcase unless s.blank?
end
编辑:修改代码,将.strip.downcase延迟到空白测试之后。谢谢您的回答。同意不进行预优化,只是尝试移植它。如果你想在同一个数组中重复两次:some|string.split','.reject&:empty?.map{e | e.strip.downcase}如果有什么问题,它很可能是我的代码,但是输入'first,second,thirD',会在数组中产生4项而不是3项。末尾有一项C版本没有返回。有人能验证吗?@blu:很难弄清楚您的C代码的确切边缘情况,因为您既没有指定它们,也没有提供测试用例,您发布的代码也没有实际工作。但是,在修复它之后,我得到了一个包含四个元素的列表,包括一个空字符串作为最后一个元素,就像我的代码一样。@Ryan Bigg:我非常喜欢无点风格。我不喜欢为不值得命名的变量发明名称。命名很难,给某个东西起个名字会把它提升到一个不一定值得重视的程度。谢谢你的回答。同意不进行预优化,只是尝试移植它。如果你想在同一个数组中重复两次:some|string.split','.reject&:empty?.map{e | e.strip.downcase}如果有什么问题,它很可能是我的代码,但是输入'first,second,thirD',会在数组中产生4项而不是3项。末尾有一项C版本没有返回。有人能验证吗?@blu:很难弄清楚您的C代码的确切边缘情况,因为您既没有指定它们,也没有提供测试用例,您发布的代码也没有实际工作。但是,在修复它之后,我得到了一个包含四个元素的列表,包括一个空字符串作为最后一个元素,就像我的代码一样。@Ryan Bigg:我非常喜欢无点风格。我不喜欢为不值得命名的变量发明名称。命名很难,给某个东西起一个名字会提升它的重要性,它不一定值得。谢谢你解释为什么非变异是错误的。你的答案和我看到的很接近;在那里塞进一个零,然后压缩它。你的两个答案都有效。最后,我选择了第二个,每个区块都排在一行,并没有重新分配到s,一切看起来都很好。谢谢,布兰克?应该捕获空白字符串,那么我们可以将条带移动到条件中吗?感谢您解释为什么非变异是错误的。你的答案和我看到的很接近;在那里塞进一个零,然后压缩它。你的两个答案都有效。最后,我选择了第二个,每个区块都排在一行,并没有重新分配到s,一切看起来都很好。谢谢,布兰克?应该捕获空白字符串,这样我们可以将条带移动到条件中吗?