#ruby #macos #methods #return
#ruby #macos #методы #Возврат
Вопрос:
Мне нужно найти ключ в хэше, затем вернуть true, если этот ключ уже существует, или false, если он не существует, но по какой-то причине у меня ошибка в терминале. это мой метод:
def key_no_exist (hash,key)
hash.each do |clave,valor|
if clave == key
return false
end
end
return true
завершение
и после того, как я использую этот возврат в этом коде:
when "set"
key = sep[1] #string who contain my key
client.puts "SEND DATABLOCK: "
resp = client.gets.chomp
datablock = resp.scan(/w /)
if key_no_exist(data,key) #if the key doesn't exist, add the data block into the hash
data[:key] = datablock
client.puts"STORED: rn "
else
client.puts "CLIENT_ERROR [key already exists]rn"
end
в конце концов, когда я запускаю код в терминале, я эту проблему:
:22: предупреждение: назначенная, но неиспользуемая переменная — данные
:75: предупреждение: круглые скобки после имени метода интерпретируются как список аргументов, а не разложенный аргумент
в block (2 levels) in run':undefined local variable or method
data’ для #Server:0x00007fdd0695d8d8 (ошибка имени)
сначала я создаю хэш с именем data:
class Server
def initialize(port,ip)
@server = TCPServer.open(ip,port)
@connections = Hash.new
@clients = Hash.new
@connections[:server] = @server
@connections[:clients] = @clients
data = Hash.new
run
end
Комментарии:
1. Почему бы просто не использовать
has_key?
Ответ №1:
Я думаю, вы путаете синтаксис объявления метода и синтаксис вызова метода. Ваше объявление метода def key_no_exist(data,key)
в порядке, этот метод ожидает два аргумента, первый — это хэш, второй — ключ. Когда вы затем вызываете этот метод, вам нужно передать фактический хэш и фактический ключ, который вы проверяете. Я не уверен, какая из ваших переменных ( client
resp
или что-то еще) является хэшем, но скажите, что она вызвана your_hash
, вы вызовете этот метод if key_no_exist(your_hash, key)
следующим образом.
Ошибка, которую вы получаете undefined local variable or method data
, говорит о том, что переменная не вызывается data
, т. Е. Ее нет data = something
.
Что касается фактического метода, который вы используете, ruby поставляется с хэш-методом .has_key?
, который возвращает true, если ключ есть, else возвращает false . Поэтому вместо того, чтобы писать свой собственный метод, вы могли бы просто сделать что-то вроде if your_hash.has_key?(key)
.