First version:

userInput.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.W then
		W = true
		if tick() - prev <= 0.2 then
			hum.WalkSpeed = 20
		end
		prev = tick()
	end
	if input.KeyCode == Enum.KeyCode.A then
		A = true
	end
	if input.KeyCode == Enum.KeyCode.S then
		S = true
	end
	if input.KeyCode == Enum.KeyCode.D then
		D = true
	end
end)

userInput.InputEnded:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.W then
		W = false
	end
	if input.KeyCode == Enum.KeyCode.A then
		A = false
	end
	if input.KeyCode == Enum.KeyCode.S then
		S = false
	end
	if input.KeyCode == Enum.KeyCode.D then
		D = false
	end
	if W == false and A == false and S == false and D == false then
		hum.WalkSpeed = 10
	end
end)

Second version:

function mov(input, key, var, bool)
	if input.KeyCode == key then
		var = bool
	end
end

userInput.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.W then
		W = true
		if tick() - prev <= 0.2 then
			hum.WalkSpeed = 20
		end
		prev = tick()
	end
	mov(input, Enum.KeyCode.A, A, true)
	mov(input, Enum.KeyCode.S, S, true)
	mov(input, Enum.KeyCode.D, D, true)
end)

userInput.InputEnded:Connect(function(input)
	mov(input, Enum.KeyCode.W, W, false)
	mov(input, Enum.KeyCode.A, A, false)
	mov(input, Enum.KeyCode.S, S, false)
	mov(input, Enum.KeyCode.D, D, false)
	if W == false and A == false and S == false and D == false then
		hum.WalkSpeed = 10
	end
end)

Basically what both versions should do is when you double tap the "W" key, you enable sprinting and are able to freely run around with WASD. It is disabled when you stop moving completely.

I thought they would both function the same, however, only the first version does what I wanted it to do. The second version never returns false so you end up running forever.

I just wanted to somehow shorten it. Is there a reason why it does this?