рубин изменить объект - PullRequest
       3

рубин изменить объект

1 голос
/ 24 марта 2011

У меня есть код:

def crop_word (film_title)
  size = film_title.size
  film_title[0...size-2] if size > 4
end

film = "Electrocity"
p crop_word film

Что мне делать, если я хочу изменить объект film? (Как я могу создать crop_word метод как метод мутатора?)

p crop_word film #=> "Electroci"
p crop_word film #=> "Electro"
p crop_word film #=> "Elect"

Ответы [ 4 ]

3 голосов
/ 24 марта 2011
def crop_word! (film_title)
  film_title.size > 4 ? film_title.slice!(0..-3) : film_title
end

puts crop_word! "1234567" #=>"12345"
1 голос
/ 24 марта 2011

В 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 не выводит то, что вы, кажется, хотите, поскольку он сохраняет конечные пробелы.

0 голосов
/ 24 марта 2011

Вопрос не понятен. Я полагаю, вы хотите удалить последний символ, если он длиннее 4.

class String
    def crop_word!; replace(self[0..(length > 4 ? -2 : -1)]) end
end


puts 'Electrocity'.crop_word! # => 'Electrocit'
0 голосов
/ 24 марта 2011
def crop_word (film_title)
  size = film_title.size
  film_title[size-2..size]="" if size > 4
  film_title
end

Как правило, вы должны либо использовать метод, который уже выполняет мутацию на месте, либо заново открыть соответствующий класс и присвоить self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...