Почему это сравнение строк дает этот результат в ruby?

k=[]

path="E:/expr/amit.txt"
name="amit"

File.open("amit.txt").each do |l| 
  k<< l
end

puts k[0]
puts name.eql?("k[0]")

О/р amit

ложно

почему o/p, содержащий false?, он должен дать true

Ответ 1

Если вы не знаете, почему ваша программа не работает, .inspect является вашим другом.

k=[]

path="E:/expr/amit.txt"
name="amit"

File.open("amit.txt").each do |l|
  puts "Debugging: l is #{l.inspect}"
  k<< l
end

puts k[0]
puts name.eql?("k[0]")
puts "Debugging: name is #{name.inspect}, while k[0] is #{k[0].inspect}"

Ответ 2

Значение name равно "amit". Вы проверяете, равна ли строка "amit" строке "k[0]". Это не так, поэтому вы ошибаетесь.

То, что вы, вероятно, хотели сделать, это name.eql?(k[0]), который будет проверять, является ли значение k[0] "amit". Однако это все равно вернет false, потому что k[0] является "amit\n", а не "amit".

Чтобы исправить это, вы должны сделать k << l.chomp вместо k << l, чтобы удалить завершающий \n.

Ответ 3

Попробуйте сделать chomp, прежде чем сохранять k

k=[]
name="amit"
File.foreach("file") do  |line|
  k<<line.chomp
end
p k.grep(name)
puts name.eql?(k[0])

Выход

$ cat file
amit
submit

$ ruby test.rb
["amit"]
true

Ответ 4

Вы тестируете строку "amit" по строке "k[0]". Я думаю, вы, вероятно, хотите puts name.eql?(k[0])