Если я правильно интерпретирую, этот вопрос, кажется, требует что-то вроде операции минус (-) между строками, то есть противоположности встроенной операции плюс (+) (конкатенация).
В отличие от предыдущих ответов, я пытаюсь определить такую операцию, которая должна подчиняться свойству:
IF c = a + b THEN c - a = b AND c - b = a
Для этого нам нужно всего три встроенных метода Ruby:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
Я не буду объяснять, как это работает, потому чтоэто легко понять, запуская один метод за один раз.
Вот пример кода концепции:
# minus_string.rb
class String
def -(str)
partition(str).values_at(0,2).join
end
end
# Add the following code and issue 'ruby minus_string.rb' in the console to test
require 'minitest/autorun'
class MinusString_Test < MiniTest::Test
A,B,C='abra','cadabra','abracadabra'
def test_C_eq_A_plus_B
assert C == A + B
end
def test_C_minus_A_eq_B
assert C - A == B
end
def test_C_minus_B_eq_A
assert C - B == A
end
end
Последнее слово, если вы используете последнюю версию Ruby (> = 2.0): используйте уточнения вместо строки обезьяны-патчинга, как в предыдущем примере.
Это так же просто, как:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
и добавьте using MinusString
перед блоками, где вам это нужно.