2011-12-03 40 views

Trả lời

2

Ngoài ra còn có một phương pháp đặc biệt cho việc này:

array.grep(/good/) # => ["Ham is good"] 

Với #grep bạn có thể làm một rất nhiều vì biểu thức chính quy ...

+2

Điều này không giải quyết được vấn đề đặt thành phần mảng thành giá trị khác. – cvshepherd

+2

@maprihoda Lưu ý rằng trong khi 'grep' _is_ thuận tiện, không có gì ngăn cản bạn sử dụng regex với' select' hoặc 'find' (như trong câu trả lời của tôi). Thật vậy, bạn có thể thực hiện ** nhiều hơn nữa ** với các phương pháp chặn, ví dụ: 'select {| s | s = ~/good/i && s.length> 3} '. – Phrogz

+0

@Phrogz nhiều hơn về mặt biểu thức chính quy; Tuy nhiên, bạn nói đúng, bạn có thể làm rất nhiều với lựa chọn, ví dụ chọn thứ hai trong bình luận của bạn minh họa nó rất độc đáo – maprihoda

13

Vì không trả lời cho đến nay hướng dẫn bạn cách cập nhật chuỗi trong mảng với giá trị mới, dưới đây là một số tùy chọn:

# Find every string matching a criteria and change them 
array.select{ |s| s.include? "good" }.each{ |s| s.replace("bad") } 

# Find every string matching a pattern and change them 
array.grep.replace("bad").each{ |s| s.replace("bad") } 

# Find the first string matching a criteria and change it 
array.find{ |s| s =~ /good/ }.replace("bad") 

Tuy nhiên, tất cả những điều trên sẽ thay đổi mọi trường hợp của chuỗi. Ví dụ:

jon = Person.new "Johnny B. Goode" 
array = [ jon.name, "cat" ] 
array.find{ |s| s =~ /good/i }.replace("bad") 

p array #=> "bad" 
p jon #=> #<Person name="bad"> Uh oh... 

Nếu bạn không muốn bên này có hiệu lực-nếu bạn muốn thay thế các chuỗi trong mảng với một khác nhau chuỗi, nhưng không thay đổi chuỗi riêng của mình-thì bạn cần phải tìm ra chỉ số của mặt hàng đó và cập nhật rằng:

# Find the _first_ index matching some criteria and change it 
array[ array.index{ |s| s =~ /good/ } ] = "bad" 

# Update _every_ item in the array matching some criteria  
array[i] = "bad" while i = array.index{ |s| s =~ /good/i } 

# Another way to do the above 
# Possibly more efficient for very large arrays any many items 
indices = array.map.with_index{ |s,i| s =~ /good/ ? i : nil }.compact 
indices.each{ |i| array[i] = "bad" } 

Cuối cùng, đơn giản nhất và hầu hết là nhanh nhất, mà không mucking về với chỉ số:

# Create a new array with the new values 
new_array = array.map do |s| 
    if s =~ /good/i # matches "Good" or "good" in the string 
    "bad" 
    else 
    s 
    end 
end 

# Same thing, but shorter syntax 
new_array = array.map{ |s| s =~ /good/i ? "bad" : s } 

# Or, change the array in place to the new values 
new_array = array.map!{ |s| s =~ /good/i ? "bad" : s } 
2

map! giống như một lựa chọn tốt.

x = ['i', 'am', 'good'] 
def change_string_to_your_liking s 
    # or whatever it is you plan to do with s 
    s.gsub('good', 'excellente!') 
end 
x.map! {|i| i =~ /good/ ? change_string_to_your_liking(i) : i} 
puts x.inspect 
+0

Câu trả lời hay, nhưng lưu ý rằng OP không bao giờ nói bất cứ điều gì về việc thay đổi chuỗi ('gsub'), nhưng thay thế nó bán buôn. – Phrogz

+2

@Phrogz câu hỏi là rất không rõ ràng về những gì nên được thiết lập để những gì – maprihoda

+0

Maprihoda là chính xác. OP nói 'đặt chuỗi thành biến mới'. Đối với tất cả chúng ta biết rằng có thể có nghĩa là tạo ra một giá trị số nguyên từ chuỗi. Nó thực sự có thể yêu cầu thay thế, nhưng điều này không được nêu rõ. Do sự mơ hồ, tôi đã không đưa ra giả định về ý định chính xác của sửa đổi biến và cung cấp một phương thức có nội dung có thể dễ dàng được sửa đổi theo ý thích của mình. Lưu ý tên của phương thức 'change_string_to_your_liking' và chú thích' # hoặc bất cứ điều gì bạn định làm với s'. – kikuchiyo

Các vấn đề liên quan