Crash IRB (интерактивный Ruby)

18

Ruby поставляется со встроенным REPL, что очень удобно.

скриншот IRB

Ваша задача состоит в том, чтобы разбить его на минимальное количество кода!

Определение «сбой» - «заставить его выйти непреднамеренно ». Это означает exit, quit, abort, irb_exit, irb_quit, и др. и др. не действительные ответы.

Кроме того, вы не можете вызывать побочные эффекты для любой другой части системы. Например, `rm -rf /`тоже недействительно.

Любая версия 1.9.3 или выше действительна. Если ваш код работает только с определенной версией Ruby, вы можете указать это в ответе.

Последнее ограничение заключается в том, что вы не можете полагаться на какие-либо драгоценные камни.

Это , поэтому выиграет самый короткий код IRB!

Дверная ручка
источник
Я могу рискнуть, пожалуйста?
Цифровая травма
3
Вау. я не знаю рубина, и после прочтения этих ответов я никогда не выучу его.
Изабера
«Определение« сбой »-« заставить его выйти непреднамеренно ».« Как мы должны писать код, предназначенный для выполнения чего-то непреднамеренного? Я голосую, чтобы закрыть как непонятно, что вы спрашиваете.
msh210

Ответы:

6

5 персонажей

ENV=0

(вдохновленный ответом @daniero )

Говард
источник
не работает для меня:irb(main):001:0> ENV=0 (irb):1: warning: already initialized constant ENV
Брайан Минтон
@BrianMinton Был только 1.9.3p194 под рукой, и он «работает» с этой версией.
Говард
ах, моя версия довольно старая:irb 0.9.6(09/06/30)
Брайан Минтон
1
@BrianMinton, это последняя версия irb
DarkHeart
17

16 символов

String=0
String=0

Не самое короткое, но я думаю, что забавно, что он не падает до второй строки. Генерирует примерно 20 строк текста перед выходом из IRB. По какой-то причине его нельзя сократить, например 2.times{String=0}.


редактировать

Из всех ответов на данный момент это единственный, который сработал для меня (и он работает во всех версиях, которые я мог заполучить), и я протестировал все из них в следующих версиях:

На любом типе Linux, который я получаю ssh, поступая в мой университет:
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
ruby 1.8.5 (2006-08-25) [x86_64-linux]
Mac OS X Mavericks по умолчанию:
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
Установлено через Homebrew на OS X:
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.0]

редактировать 2

7 персонажей

Объединение моей первой версии (и / или ответа @ Howard , для максимальной перекрестной ссылки) с ответом @ Chinese perl goth :

STDIN=0
daniero
источник
Array=0вылетает сразу.
Примо
1
@ Примо круто, но я не могу заставить его работать: / (См. мое редактирование)
daniero
То же самое здесь, только этот и последний ответ стандартного ответа работают, все остальные дают только предупреждения.
user12205
Да, stdin у меня тоже работает. Это было опубликовано после моего редактирования.
Даниеро
1
Вы можете сократить вторую строку до, =и она все еще падает.
Fraxtil
10

12 символов

ruby - не совсем моя чашка чая, но я только что узнал, что irb ведет себя забавно, когда я закрываю stdin :)

$stdin.close

протестировано на irb 0.9.6 (09/06/30) и ruby ​​1.9.3p194

китайский Perl гот
источник
5
STDIN.closeтоже работает, и это на 1 символ меньше!
Каву
+1, потому что это так очевидно, когда вы смотрите на это, что это вызовет проблемы :) Мой ответ, вероятно, скорее ошибка, но для этого вы не можете ожидать, что IRB сделает что-то умное; это как в «Звездном пути» или где-то еще, когда супер-умному роботу задают невозможный вопрос, и он взрывается.
Даниеро
Связанный: $>.close.
Джордан
7

10 9 символов

Более короткий вариант ответа @ daniero:

String=1
-

Это работает по крайней мере в стандартном OS X Mavericks Ruby (2.0.0).

Ответ в основном основан на том факте, что Tokenфункция Ruby выполняет caseвходной токен. Один из случаев проверяет String, который был переопределен первой строкой. Этот случай терпит неудачу, поэтому случай падает до значения по умолчанию, которое предполагает, что объект имеет средство ancestorsдоступа (которого у него нет).

Так как в токенизаторе есть «ошибка», первая строка не будет ошибочной, потому что строка вступает в силу только после завершения анализа. Таким образом, это влияет только на последующие строки. Последующие строки должны содержать какой-то оператор, чтобы увидеть сбой.

nneonneo
источник
+1 За объяснение. Но кто этот Данейро? ;)
Daniero
@daniero: мои извинения, я, кажется, лизедекс сегодня.
nneonneo
6

5 персонажей

$>=$<

Устанавливает stdout в stdin, который выдает ошибку при попытке открыть stdin для записи и вылетает irb.

фотоионизированного
источник
Обратите внимание, что это проверено на ruby ​​2.3.0p0
фотоионизировано
5

22 персонажа

def method_missing;end

По-видимому, это портит некоторые внутренние компоненты. (Чтобы исправить это, добавьте self.после def.)

Дверная ручка
источник
4

12 персонажей

def send;end

Насколько я знаю, в классе Object есть четыре метода, которые показывают такое поведение:

send
method_missing
respond_to?
respond_to_missing?
Дэвид Херрманн
источник
4
В моем IRB он просто возвращается nilи продолжает
daniero
@daniero 1.8.6 и 1.9.3 оба аварийно завершают работу.
Примо
@primo больше не падает на 2.0.0
drusepth
4

5 персонажей

IRB=0

Ничто так не мешает IRB, как переопределение IRB.

vgoff
источник
Да! Это не дает сбоя, но выдает 20 строк ошибок после всего!
Мега Человек
Наверное, сейчас другая версия IRB, @MegaMan, определенно YMMV.
vgoff
Все равно круто!
Мега Человек
2

12 10 персонажей

exec"exec"

Я не знаю, считается ли это из-за exec

Какао бобы
источник
1
Вы можете избавиться от места после первогоexec
Fund Monica's судебный процесс
0

26 + 1 = 27 символов

Это не очень похоже на игру в гольф, но я был удивлен, обнаружив это случайно, и подумал, что другим это понравится.

class Fixnum;def +;end end

Я добавил +1 к счету, потому что вы должны нажать Enter второй раз после ввода вышеуказанного (но не +2, потому что никто больше не считал Enter).

Иордания
источник