В Ruby вы не можете передавать параметры по ссылке, как в C-подобных языках.Самый простой способ - вернуть новое значение и затем присвоить входную переменную.
film_title = crop_word(film_title)
Что вы можете сделать, это поместить film_title в контейнер.
class Film
attr_accessor :title, :length
end
film = Film.new
film.title = "Butch Cassidy and the Sundance Kid"
def crop_word (film)
length = film.title.length
film.title=film.title[0..length-2] if length > 4
end
puts crop_word(film)
# Butch Cassidy and the Sundance K
puts crop_word(film)
# Butch Cassidy and the Sundance
puts crop_word(film)
# Butch Cassidy and the Sundan
IЯ бы не рекомендовал его, но вы могли бы также обезопасить патч от класса String
class String
def crop_word!
self.replace self[0..self.length-2] if self.length > 4
end
end
title = "Fear and Loathing in Las Vegas"
title.crop_word!
# => "Fear and Loathing in Las Vega"
title.crop_word!
# => "Fear and Loathing in Las Veg"
title.crop_word!
# => "Fear and Loathing in Las Ve"
Наконец, есть черная магия eval и привязки, которую вы, вероятно, должны быть безумны, чтобы фактически использовать.
def crop_word(s, bdg)
eval "#{s}.chop!.chop! if #{s}.length > 4", bdg
end
title="The Dark Knight"
crop_word(:title, binding)
puts title
# The Dark Knig
crop_word(:title, binding)
puts title
# The Dark Kn
crop_word(:title, binding)
puts title
# The Dark
Кроме того, ваш crop_word
не выводит то, что вы, кажется, хотите, поскольку он сохраняет конечные пробелы.