Получение входных данных из аргументов командной строки — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Получение входных данных из аргументов командной строки

2022-09-29 33
Получение входных данных из аргументов командной строки 0.00 из 5.00 0 оценок
Заказать работу

 

Ввод внешних данных не всегда интерактивен. Быстрый запуск скомпилированного кода Crystal делает его отличным выбором для приложений командной строки. Что делать, если вам нужно предоставить программе данные или параметры из командной строки? Например, давайте прочитаем из консольного ввода данные о двух валютах и их относительном курсе (1 USD = 0.8432053 EUR):

  $ crystal argv.cr USD EUR 0.84320536

Crystal, как и Ruby, имеет структуру ARGV верхнего уровня, чтобы управляться с подобными вещами:

types_and_control_flow/argv.cr

  puts "Number of command line arguments: #{ARGV.size}" # => (1)

ARGV.each_with_index do |arg, i|

puts "Argument #{i}: #{arg}" # => (2)

  end

  p ARGV # => (3)

p "Executable name: #{PROGRAM_NAME}" # => (4)

p "Path to source file: #{__FILE__}" # => (5)

p "Folder of source file: #{__DIR__}" # => (6)

 

 # (1) Количество аргументов командной строки: 3

 # (2)

  # Аргумент 0: USD

  # Аргумент 1: EUR

  # Аргумент 2: 0.84320536

 # # (3)  ["USD", "EUR", "0.84320536"]

 # (4) "Имя исполняемого файла: /$ HOME/.cache/crystal/crystal-run-argv.tmp"

 # или (4) "Имя исполняемого файла:./argv"

 

  # (5) "Путь к исходному файлу:

  # / $HOME/crystal/Book/code/types_and_control_flow/argv.cr»

  # (6) "Папка исходного файла:

 # /$HOME/crystal/Book/code/types_and_control_flow"

 

Вы можете запустить ARGV как массив с "each" или "each_with_index",
и использовать do-block для всего, что вы хотите сделать с аргументами. Вот более реалистичный пример: если вы запускаете программу db_json, как тут:

$./db_json sqlite3:/ / db/sqlite3.db

, то ARGV[0] содержит строку подключения к базе данных.

 

Ваш код имеет доступ к имени исполняемого файла посредством константы PROGRAM_NAME. Это будет "./argv", если вы создали исполняемый файл с помощью команды (ИКС):

$ crystal build program.cr

 

Когда вы запустите в командной строке что-то вроде

$ crystal program.cr

, то увидите, что исполняемый файл создается в специальной папке.cache/crystal. Здесь сохраняются все промежуточные файлы компи-лятора (такие как расширения макросов, файлы "линковщика" с рас-ширением ".o", временные файлы среды Playground и тому подобное).

 

▪ __FILE__  и  __DIR__ ▪

__FILE__ — это специальная константа, содержащая полный путь к текущему имени файла. Константа __DIR__ сообщает директорию текущего файла.

Вот версия нашего конвертера валют, которая считывает сумму в
базовой валюте из командной строки, когда запускается программа,
такая как

  $./curr_conv3 EUR

types_and_control_flow/curr_conv3.cr

base = ARGV[0]?

base = "USD" unless base

 

 

Использование строковых методов

Ваши входные данные "прибывают" в виде строк, и большинство разновидностей данных могут быть представлены как строки. Работа
со строками — это "хлеб и масло" каждого программиста. Как и Ruby,
язык Кристалла хорошо экипирован для обработки строк. Вы уже использовали строки в ходе изучения этой книги, но существует больше подходов к созданию строк и больше способов работы с ними.

Crystal, как и Ruby, поддерживает мульти-линейные (многострочные) строки:

str = "What a beautiful mineral!"

str1 = "What a

   beautiful mineral!" # multi-line string

Crystal также поддерживает использование обратной косой черты,
чтобы отделаться от некоторых символов внутри строк. Если вам
захочется создать такую же строку "str1", как приведена выше, со-
храняя все содержимое в одной строке кода, можно также напечатать следующее:

str = "What a beautiful mineral!"

str1 = "What a \nbeautiful mineral!" # multi-line string

Как правило, возникает желание устранить двойные кавычки (\") или обратную косую черту, бэкслэш (\\). Вы можете также использовать числовые исключения. Обозначение "\u" сразу за шестнадцатеричным числом позволяет задать некий символ Юникода. Например, \u2603 выдает юникодовского снеговика.

И когда у вас уже есть строки, Crystal предлагает вам много способов
их обработки:

types_and_control_flow/strings.cr

curr1 = "US Dollar"

curr1[2..4] # => " Do"

curr1.reverse # => "ralloD SU"

  curr1.size # => 9  # length or len do not exist

curr1.upcase # => "US DOLLAR"

curr1.capitalize # => "Us dollar"

curr1.includes? "la" # => true

curr1.count "l" # => 2

curr1.starts_with? "Us" # => false # case sensitive!

  curr1.ends_with? "ar" # => true

  curr1.index("a") # => 7

curr1.sub("ll", "l") # => "US Dolar"

    curr1.gsub(/([aeiou])/, "*\\1*") # => "US D*o*ll*a*r"

  curr2 = curr1.split("") # => ["U","S"," ","D","o","l","l","a","r"]

  curr2.join("-") # => "U-S- -D-o-l-l-a-r"

 

Команды split и join являются типичными строковыми операторами:

split преобразует строку в массив — мы использовали его в нашем конвертере валют — в то время как join выполняет обратную операцию, трансформацию массива в строку.

Строки создаются в так называемой "куче" (общедоступном массиве свободной памяти). Они неизменны и это значит, что вы не можете изменять их содержимое напрямую:

s = "USD"

s[2] = 's' # => Error: undefined method '[]=' for String

 

Для эффективного использования ресурсов вам желательно избегать создания избыточного количества строк. В следующем фрагменте to_s,
"+" и строковая интерполяция поочередно создают строку в куче, хотя интерполяция справляется быстрее:

  rate = 0.84320536

p "rate: " + rate.to_s # => "rate: 0.84320536"

# string interpolation is more efficient:

p "rate: #{rate}" # => "rate: 0.84320536"

 

Вы можете также использовать конструктор строк и метод "<<":

str = String.build do |io|  # Это — String-Builder

io << "rate: " << rate

  end

p str # => "rate: 0.84320536"

 

По мере того, как ваши проекты становятся все более сложными, эффективная обработка строк будет иметь ещё большее значение.

▪ Используем методы "each" ради производительности ▪

Используйте методы "each" для итерации: они намного быстрее прос-
того цикла "while" или зацикливания вдоль строки путем индексации
с помощью [ ]

 

Ваш черёд № 2

1) Разбейте следующую строку названий минералов на массив, где все названия представлены заглавными буквами:

gold;topaz;apatite;wolframite;calcite;diamond. (золото; топаз; апатит; вольфрамит; кальцит; алмаз.)

(Подсказка: используйте метод "map", о котором вы узнали в разделе §"Сцепливание методов").

 

2) Строки в сущности — просто последовательности символов в кодировке UTF-8. Если вы любитель кошек, то можете запросто ска-
зать: "hi 猫".

Выполните итерацию над этой строкой и напечатайте поочередно каждый символ, "кодовый указатель" (англ. codepoint — определяет сегмент в диапазоне значений) и байт. Для получения информации о доступных методах обратитесь к документации —

https://crystal-lang.org/api/master/String.html;

• Что за кодовый указатель Юникода соответствует китайскому символу для кошки, и сколько байт занимает этот символ?

3) object_id; Покажите, что две постоянные строки с одинаковым значением ссылаются на один и тот же объект в "куче". (Подсказка: используйте метод object_id;)

Почему же Crystal реализует это именно так?

Главная причина вот в чём: в тех случаях, когда два объекта имеют совпадающие object_id, оператор == возвращает значение true, как и метод "same?". Что происходит, когда вы запрашиваете object_id для целочисленного или булева (Boolean) значения?

 


Поделиться с друзьями:

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.018 с.