Перейти к содержимому


Фотография

[1.7.10] ComputerCraft [1.74]


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2863

#2061 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 16.06.2013 - 16:59

Нужна функция выхода из программы, кто-то подскажет?

Попробуй
error()


#2062 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 16.06.2013 - 18:27

скинь ошибку и код сюда.

Тот код я удалил, теперь ошибка test:2: attempt to call nil
print("Enter q")if read() == "q" then exit() endprint("No exit")

Нужна функция выхода из программы, кто-то подскажет?

Попробуй
error()

Да, функция сработала как выход, благодарю. Но еще осталась путаница с типами:

И еще есть путаница с типами, если я напишу a=read(), и введу например число, то это будет численная переменная? А при вводе слова она станет строковой? Тогда как мне сделать обработку для обоих этих случаев?
Мне нужно что-бы при вводе определенного слова выполнялся свой код, а если ввели нужное число то оно заносилось в переменную b, всё дело в том что выбивает ошибку, так как идет не совпадение типов при сравнивании.

UPD: Для решения проблемы я использовал явное приведение типов. Так же появился еще один вопрос, почему этот код выводит строку bbbbb?
function a()print("aaaaa")returnprint("bbbbb")enda()
По идее return должен завершать выполнение функции.

#2063 RP2Crafter

RP2Crafter

    Добытчик камня

  • Пользователи
  • Сообщений: 217

Написал 16.06.2013 - 19:48

Вопрос скорее по локальным переменным в lua, но всетаки: Есть 2 функции, одна вызывается из другой, но в вызываемая функция не видит переменных вызывающей:
Скрытый текст
Нашел такое решение, но оно сильно на костыль смахивает:
Скрытый текст

Изображение


#2064 Cyxapuk

Cyxapuk

     

  • Главные модераторы
  • Сообщений: 8706
  • Ник в Minecraft:
    Meegoo

Написал 16.06.2013 - 20:13

Если ты про i, то нефиг было ее локальной делать (local i=0).Так как она локальная, то она действует в пределах одной функции и только. И вызвать локальную переменную одной функции из другой нельзя.

V6xCzSN.png


#2065 RP2Crafter

RP2Crafter

    Добытчик камня

  • Пользователи
  • Сообщений: 217

Написал 16.06.2013 - 20:20

Поправил, но хотел что-бы все переменные были локальными(просто так захотелось), ну пусть так.

Изображение


#2066 Storm Whisper

Storm Whisper

    Зачарователь

  • Пользователи
  • Сообщений: 1554
  • Откуда: Убежище 13

Написал 16.06.2013 - 20:49

Так же появился еще один вопрос, почему этот код выводит строку bbbbb? По идее return должен завершать выполнение функции.

Похоже, что надо писать return nil, но тогда он не видит end, из-за чего приходится писать так:
Скрытый текст
Тупо как-то. return должен сам по себе быть выходом из процедуры. Хотя мб именно для выхода используется другая команда, пойду шерстить гайд. upd нашёл: do return end.

Return (или break) должен быть последним оператором в блоке (иначе следующие за ним операторы никогда не выполнятся). Если действительно необходимо вставить return или break в середину блока, то следует применить составной оператор, например do return end и do break end.

ЗЫ луа умный язык, так что '1'+'2'=3

#2067 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 16.06.2013 - 21:43

Скрытый текст

К этому моменту я переписал функцию так что return не требуется. Но спасибо за старания, мне это все равно пригодится.
Вот только не пойму логики работы этого do return end, и кто это придумал?
do break end - и с брейком то же самое, надеюсь continue хотя бы не нужно в конец добавлять?))
'1'+'2'=3 //ну хз конечно, но по логике это символы, и они должны объединятся, то есть: '1'+'2'="12"

#2068 Storm Whisper

Storm Whisper

    Зачарователь

  • Пользователи
  • Сообщений: 1554
  • Откуда: Убежище 13

Написал 16.06.2013 - 21:50

Неа, Луа всегда автоматически пытается конвертнуть тип переменной. А вот '12'=='1'..'2'ЗЫ цитату бы в спойлер спрятал..

#2069 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 16.06.2013 - 22:21

Неа, Луа всегда автоматически пытается конвертнуть тип переменной. А вот '12'=='1'..'2'

Я так понял в lua знак "+" выступает только в роли арифметического оператора, и при использовании срабатывает неявное приведение типов(для string-ов), например в C++ "+", и конкатенация, и ар. оператор.

ЗЫ цитату бы в спойлер спрятал..

Окай, уже.

#2070 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 17.06.2013 - 03:26

И еще есть путаница с типами, если я напишу a=read(), и введу например число, то это будет численная переменная? А при вводе слова она станет строковой? Тогда как мне сделать обработку для обоих этих случаев? Мне нужно что-бы при вводе определенного слова выполнялся свой код, а если ввели нужное число то оно заносилось в переменную b, всё дело в том что выбивает ошибку, так как идет не совпадение типов при сравнивании.

По-умолчанию read() возвращает тип string даже для чисел. Если нужно получить число - используй tonumber(read())

Для решения проблемы я использовал явное приведение типов. Так же появился еще один вопрос, почему этот код выводит строку bbbbb?

function a()print("aaaaa")returnprint("bbbbb")enda()
По идее return должен завершать выполнение функции.

return не завершает, а возвращает следующую за ним переменную или функцию. В данном случае возвращает print("bbbbb"). Если требуется использовать его, как завершение то пиши return true. В таком случае при вызове эта функция вернет true. Пример использования return в функиях с условием проверки: если переменная равна заданному числу - return true иначе return false.

#2071 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 17.06.2013 - 11:06

Скрытый текст

Теперь я начинаю понимать почему оно вывело вторую строку. Вот она обратная сторона отсутствия ";" в синтаксисе.

Если требуется использовать его, как завершение то пиши return true.

Нет, так не работает, пишет ошибку. Думаю для прерывания лучше пользоваться do return end, который предложил Storm Whisper.

#2072 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 17.06.2013 - 12:00

Если требуется использовать его, как завершение то пиши return true.

Нет, так не работает, пишет ошибку. Думаю для прерывания лучше пользоваться do return end, который предложил Storm Whisper.

Да, действительно напрямую так сказать в "корне" функции использовать return нельзя. Да и логично это, ведь по сути в таком случае функция никогда не сможет быть выполнена до конца. Как я и приводил пример выше return нужно использовать например в условии. Иначе можно просто написать end. Например:
Скрытый текст


#2073 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 17.06.2013 - 14:07

Да, действительно напрямую так сказать в "корне" функции использовать return нельзя. Да и логично это, ведь по сути в таком случае функция никогда не сможет быть выполнена до конца. Как я и приводил пример выше return нужно использовать например в условии. Иначе можно просто написать end.

Это да, та функция что я описал не имеет смысла, но я думаю что выдавать ошибку не есть логично, было бы лучше выполнить код как есть, всё что после return проигнорировать, разве что выдать предупреждение(хотя встроенная среда разработки не имеет таких возможностей).

#2074 Storm Whisper

Storm Whisper

    Зачарователь

  • Пользователи
  • Сообщений: 1554
  • Откуда: Убежище 13

Написал 17.06.2013 - 14:34

Lexor фигню поришь. Я же уже написал как надо return юзать в середине. ; тут ни при чём, возвращаемые значения пишутся в той же строке, что и return.

#2075 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 17.06.2013 - 14:58

Lexor фигню поришь. Я же уже написал как надо return юзать в середине. ; тут ни при чём, возвращаемые значения пишутся в той же строке, что и return.

В чем же фигня то? Выше писал практическое применение return - в условиях сравнения к примеру. Вот простейший пример использования return: функция проверяет является ли ее переменная единицей, если да - возвращает true, иначе false.
Скрытый текст
В середине использовать do return end абсолютно бессмысленно. Зачем тогда вообще что-то писать после этого выражения, если оно никогда не будет выполнено? Лучше уж сразу удалить мусор-код после него и написать end.

#2076 Storm Whisper

Storm Whisper

    Зачарователь

  • Пользователи
  • Сообщений: 1554
  • Откуда: Убежище 13

Написал 17.06.2013 - 15:21

Ну да, увлёкся малость. Действительно, такой код смысла не имеет.

#2077 RP2Crafter

RP2Crafter

    Добытчик камня

  • Пользователи
  • Сообщений: 217

Написал 17.06.2013 - 15:31

Тут совсем недавно говорили, что lua умный и сам умеет определять тип. Вот вопрос такой код работает правильно(сравнивает с числом):
local tArgs={ [paste][/paste][paste][/paste][paste][/paste] }if tonumber(tArgs[1])==5 then  print("Ok")else print("Nope")end
такой нет:
local tArgs={ [paste][/paste][paste][/paste][paste][/paste] }if tArgs[1]=5 then  print("Ok")else print("Nope")end
Получается не преобразовал? Или это особенности tArgs всегда читать строки(ага с ним разбираюсь)?

Изображение


#2078 Storm Whisper

Storm Whisper

    Зачарователь

  • Пользователи
  • Сообщений: 1554
  • Откуда: Убежище 13

Написал 17.06.2013 - 15:39

А что такое )=? Смайлик, или я что-то не знаю об операциях сравнения?

#2079 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 17.06.2013 - 15:40

почему этот код выводит строку bbbbb?

function a()print("aaaaa")returnprint("bbbbb")enda()
По идее return должен завершать выполнение функции.

function a()print("aaaaa")return nilprint("bbbbb")enda()

Получается не преобразовал? Или это особенности tArgs всегда читать строки(ага с ним разбираюсь)?

Lua преобразовывает строку в число только при "+", "-", "/", "*", "%". Число в строку при "..". В массиве "..." все параметры string. И еще код кривой.
local tArgs={ [paste][/paste][paste][/paste][paste][/paste] }if tArgs[1]==5 then print("Ok")else print("Nope")end


#2080 RP2Crafter

RP2Crafter

    Добытчик камня

  • Пользователи
  • Сообщений: 217

Написал 17.06.2013 - 15:47

А что такое )=? Смайлик, или я что-то не знаю об операциях сравнения?

Набирал от руки, лишнюю скобку поставил...

Изображение



Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных