Crash IRB (Ruby interativo)


18

O Ruby vem com um REPL embutido, o que é bastante útil.

captura de tela do IRB

Seu desafio é travá-lo com a menor quantidade de código!

A definição de "acidente" é "fazê-lo sair de forma não intencional ". Este meio exit, quit, abort, irb_exit, irb_quit, et. al. não são respostas válidas.

Além disso, você não pode causar efeitos colaterais a nenhuma outra parte do sistema. Por exemplo, `rm -rf /`também não é válido.

Qualquer versão 1.9.3 ou superior é válida. Se seu código funcionar apenas em uma versão específica do Ruby, você poderá especificar isso na resposta.

A restrição final é que você não pode confiar em nenhuma gema.

Isso é , então o código mais curto que trava o IRB vence!


Eu posso jogar golfe, anser, plz?
Digital Trauma

3
Uau. não conheço ruby ​​e, depois de ler essas respostas, nunca aprenderei.
Izabera 27/02/14

"A definição de 'falha' é 'fazê-la sair de forma não intencional.'" Como devemos escrever código destinado a fazer algo não intencional? Eu voto para fechar o que você está perguntando.
Msh210

Respostas:


6

5 caracteres

ENV=0

(inspirado na resposta de @daniero )


não funciona para mim:irb(main):001:0> ENV=0 (irb):1: warning: already initialized constant ENV
Brian Minton 27/02

O @BrianMinton tinha apenas um 1.9.3p194 em mãos e "funciona" com essa versão.
277 Howard Howard

ah, minha versão é bastante antiga:irb 0.9.6(09/06/30)
Brian Minton

1
@BrianMinton que é a versão mais recente do IRB
darkheart

17

16 caracteres

String=0
String=0

Não é o mais curto, mas acho engraçado que ele não trava até a segunda linha. Gera aproximadamente 20 linhas de texto antes da saída do IRB. Por alguma razão, não pode ser reduzido para, por exemplo 2.times{String=0}.


editar

De todas as respostas até agora, essa é a única que funcionou para mim (e funciona em todas as versões em que pude colocar minhas mãos), e testei todas elas nessas versões:

Em qualquer tipo de Linux que eu recebo ao entrar sshna minha universidade:
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
ruby 1.8.5 (2006-08-25) [x86_64-linux]
Padrão do Mac OS X Mavericks:
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
Instalado através do Homebrew no OS X:
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.0]

editar 2

7 caracteres

Combinando minha primeira versão (e / ou a resposta de @ Howard , para referência cruzada máxima) com a resposta de @ chinese perl goth :

STDIN=0

Array=0trava imediatamente.
primo

1
@primo legal, mas não consigo fazê-lo funcionar: / (Veja minha edição) #
daniero 27/02/2014

O mesmo aqui, apenas esta e a resposta de fechamento final funcionam, todos os outros dão apenas avisos.
user12205

Sim, o stdin one funciona para mim também. Foi publicado após a minha edição.
Daniero 27/02

1
Você pode encurtar a segunda linha para =e ela ainda trava.
Fraxtil 27/02

10

12 caracteres

ruby não é exatamente minha xícara de chá, mas eu acabei de descobrir que o irb age engraçado quando fecho o stdin :)

$stdin.close

testado em irb 0.9.6 (30/06/30) e ruby ​​1.9.3p194


5
STDIN.closefunciona também, e é 1 char a menos!
Kavu

+1 porque é tão óbvio quando você olha para ele que causará problemas :) Minha resposta provavelmente é mais um bug, mas para este você não pode esperar que o IRB faça algo inteligente; é como em Star Trek ou o que quer que seja quando eles fazem a um robô super inteligente uma pergunta impossível e ela explode.
Daniero 27/02

Relacionados: $>.close.
Jordânia

7

10 9 caracteres

Uma variante mais curta da resposta de @ daniero:

String=1
-

Isso funciona pelo menos no OS X Mavericks Ruby padrão (2.0.0).

A resposta depende basicamente do fato de que a Tokenfunção Ruby faz um caseno token de entrada. Um dos casos é verificado String, redefinido pela primeira linha. Como esse caso falha, o caso cai para o padrão, que assume que o objeto possui um ancestorsacessador (o que não possui).

Como o "bug" está no tokenizer, a primeira linha não falhará porque a linha só entrará em vigor após a conclusão da análise. Assim, afeta apenas as linhas subseqüentes. As linhas subseqüentes devem conter algum tipo de operador para ver a falha.


+1 Para a explicação. Mas quem é esse daneiro? ;)
daniero

@daniero: Minhas desculpas, hoje pareço lisódica.
Nneonneo 28/02

6

5 caracteres

$>=$<

Define stdout como stdin, o que gera um erro ao tentar abrir o stdin para gravação e trava o irb.


Observe que isso é testado no ruby ​​2.3.0p0
fotoionizado

5

22 caracteres

def method_missing;end

Aparentemente, ele mexe com alguns componentes internos do IRB. (Para corrigi-lo, adicione self.depois def.)


4

12 caracteres

def send;end

Até onde eu sei, existem quatro métodos na classe Object que mostram esse tipo de comportamento:

send
method_missing
respond_to?
respond_to_missing?

4
No meu IRB, simplesmente retorna nile continua #
daniero 27/02

@daniero 1.8.6 e 1.9.3 ambos travam.
primo

O @primo não falha mais no 2.0.0
drusepth 28/03

4

5 caracteres

IRB=0

Nada perturba o IRB como redefinir o IRB.


sim! Isso não falha, mas imprime 20 erros de linhas depois de qualquer coisa!
Mega Man

Provavelmente uma versão diferente do IRB agora, @MegaMan, agora, definitivamente YMMV.
vgoff

Ambos são legais, de qualquer maneira!
Mega Man



0

26 + 1 = 27 caracteres

Isso não é muito bom, mas achei divertido descobri-lo por acidente e achei que outros pudessem gostar.

class Fixnum;def +;end end

Eu adicionei +1 à pontuação porque você deve pressionar Enter uma segunda vez após inserir as opções acima (mas não +2 porque ninguém mais contou com Enter).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.