Coś nie działa w kodzie

Jestem kompletnie początkującym w Ruby, tylko zaznaczam :wink:
Wczoraj otworzyłem sobie książkę do Ruby i przepisałem kod prostej gry sieciowej z wątkami w kamień, papier i nożyce, która korzysta z kluczy wątków. Utworzyłem plik .rb, wrzuciłem w konsolę i pokazuje błąd w linii 58 syntax error, unexpected end-of-input…

Poniżej załączam pełny kod

module Games
class RPS
	include Comparable
	WINS = [%w{ rock scissors },
			%w{ scissors paper},
			%w{ paper rock}]
	attr_accessor :move
	def initialize(move)
		@move = move.to_s
	end
	def <=>(other)
		if move == other.move
			0
		elsif WINS.include?([move, other, move])
			1
		elsif WINS.include?([other, move, move])
		else
			raise ArgumentError, "Coś się nie zgadza."
		end
	end
	def play(other)
		if self > other
			self
		elsif other > self
			other
		else
			false
		end
	end
end		
require 'socket'
require_relative 'rps'
s = TCPServer.new(3939)
threads = []
2.times do |n|
conn = s.accept
threads << Thread.new(conn) do |c|
Thread.current[:number] = n + 1
Thread.current[:player] = c	
c.puts "Witaj, graczu #{n+1}!"
c.print "Jaki jest Twój ruch? (kamień, papier, nożyce) "
Thread.current[:move] = c.gets.chomp
c.puts "Dzięki....poczekaj."
end
end
a,b = threads
a.join
b.join
rps1, rps2 = Games::RPS.new(a[:move]), Games::RPS.new(b[:move])	
winner = rps1.play(rps2)
if winner
	result = winner.move
else
	result = "REMIS!"
end
thread.each do |t|
	t[:player].puts "Zwycięzcą jest #{result}!"
end

Myślę, że wszystko przepisałem prawidłowo, ponieważ różne fragmenty były rozrzucone i trzeba było poskładać, a jeszcze nawet nie rozpocząłem właściwej nauki więc proszę o wyrozumiałość :wink:

Nie zamknąłeś modułu Games. BTW zwracaj uwagę na takie “pierdoły” jak wcięcia, jeśli robisz je poprawnie, wykrycie tego rodzaju błędu zajmuje ok. 1.5 sekundy.

Dokładnie w którym miejscu nie zamknąłem tego Games? Tak jak mówię, przepisałem sobie tylko ten kod z końca książki, żeby sprawdzić jak to działa i nie łapię się jeszcze w tym.

Trudno mi powiedzieć, co autor miał na myśli, ale na moje Games powinien być zamknięty przed wywołaniem require 'socket'.

Nie działa, zrobiłem w ten sposób

require 'socket'
end

Pisałem “przed” wywołaniem require 'socket' (choć to tutaj nie powinno mieć znaczenia). Co nie działa? Dalej sypie tym samym błędem?

Jaka to książka?

wywal ta ksiązke, do tego przepisywanie kodu na pałe jak sie uczysz i nie rozumiesz nic nie da, zacznij od poczatku od jakis podstaw

The Well-Grounded Rubyist wydanie II, Dawid A.Black

Zaczynam od początku, tak wczoraj wieczorem się nudziłem i przepisałem sobie.

@gotar @radarek czemu zwróciliście uwagę na książkę, coś źle? Autor jest świetnym specjalistą Rubiego, opinie na amazonie same pozytywne, więc nie wiem? Kod przepisałem tak jak było to napisane, pominąłem w pewnych miejscach wcięcia ale to raczej nie ma większego wpływu na działanie.

Ale ma ogromny wpływ na czytelność.

Szybkie zgooglowanie twojego kodu daje https://github.com/rahult/books/blob/master/well_grounded_rubyist/threads/rps.rb

Ale ja nie wiedziałem kto jest autorem zanim mi nie odpisałeś :P. Chciałem natomiast sam sprawdzić w książce ten kod gdyż założyłem, że mogłeś go po prostu źle przepisać.

Kod, do którego link wkleił @marr, jest jak najbardziej poprawny składniowo:

$ wget --quiet 'https://raw.githubusercontent.com/rahult/books/master/well_grounded_rubyist/threads/rps.rb' - | ruby -c
Syntax OK

Błąd musiał powstać przy przepisywaniu.

Mowie byś zostawił tą książkę bo jak zaczynasz to z takimi kodami duzo sie nie nauczysz, watki, komunikacja na nich … zacznij od podstaw i idz powoli, Zrozum caly stdlib (Array, Enum, … ) i wtedy wez sie za inne rzeczy

1 Like

Jeśli znasz j. angielski, to psróbuj z Pickaxem. Jeśli nie znasz angielskiego - to zacznij od jego nauki.

Lypa miał na myśli “ten sposób”:

end 
require 'socket'

Usuń jeszcze:

require_relative 'rps'

i trzeci wiersz od końca uzupełnij o literkę “s”:

threads.each do |t|