Вызов функции ruby из командной строки
Как я могу напрямую вызвать рубиновую функцию из командной строки?
Представьте, что у меня был бы этот script test.rb:
class TestClass
def self.test_function(some_var)
puts "I got the following variable: #{some_var}"
end
end
Если этот script запускается из командной строки (ruby test.rb
), ничего не происходит (как предполагалось).
Есть ли что-то вроде ruby test.rb TestClass.test_function('someTextString')
?
Я хочу получить следующий вывод: I got the following variable: someTextString
.
Ответы
Ответ 1
Сначала имя класса должно начинаться с заглавной буквы, и поскольку вы действительно хотите использовать статический метод, определение имени функции должно начинаться с self.
.
class TestClass
def self.test_function(someVar)
puts "I got the following variable: " + someVar
end
end
Затем, чтобы вызвать это из командной строки, вы можете сделать:
ruby -r "./test.rb" -e "TestClass.test_function 'hi'"
Если вместо этого был test_function
в качестве метода экземпляра, вы должны были бы:
class TestClass
def test_function(someVar)
puts "I got the following variable: " + someVar
end
end
то вы вызываете его с помощью:
ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'"
Ответ 2
Здесь другой вариант, если вы обнаружите, что типизация синтаксиса ruby в командной строке неудобна, и вы действительно просто хотите передать args ruby. Здесь test.rb:
#!/usr/bin/env ruby
class TestClass
def self.test_function(some_var)
puts "I got the following variable: #{some_var}"
end
end
TestClass.test_function(ARGV[0])
Сделайте test.rb исполняемым и запустите его следующим образом:
./test.rb "Some Value"
Или запустите его следующим образом:
ruby test.rb "Some Value"
Это работает, потому что ruby автоматически устанавливает массив ARGV
в аргументы, переданные в script. Вы можете использовать ARGV[0]
или ARGV.first
для получения первого аргумента, или вы можете объединить аргументы в одну строку, разделенную пробелами, используя ARGV.join(' ')
.
Если вы делаете много материалов из командной строки, в конечном итоге вы можете использовать Shellwords, который находится в стандартном ruby lib.
Ответ 3
#!/usr/bin/env ruby
class A
def run
p :Hello_world
end
self
end.new.run
Обычный способ script Ruby - просто использовать среду выполнения верхнего уровня, называемую main. Вы можете просто начать определять методы и код, которые вы пишете вне класса, и они будут выполняться напрямую. (BTW, код внутри класса, но вне любого метода также будет работать "сам по себе".)
Во всяком случае, я с тобой... Мне нравится писать весь код в именованном классе и создавать экземпляр этого класса, поэтому вы можете комбинировать методы.. вернуть класс к собственному объекту.. а затем использовать немного кода верхнего уровня для выделения, инициализации, а затем точки в классе.
С этим вы можете просто набрать $ ruby test.rb
, и он будет делать то, что вы хотите. Или вы можете chmod +x test.rb; ./test.rb
, так как мы сделали добавить shebang.
Ответ 4
Если вы работаете с интерфейсом командной строки, я бы предложил посмотреть thor.
Thor напрямую сопоставляет ваши команды методам в определенном классе, например, thor wiki.
Ответ 5
Если у вас есть несколько аргументов для вызова в следующем примере:
class TestClass
def self.test_function(some_var1, some_var2)
puts "I got the following variables: #{some_var1}, #{some_var2}"
end
end
запустите его так (аргументы должны быть разделены запятыми в этом случае)
ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'"
Ответ 6
Просто расширение для ответа Ingenu для случая, когда функция ничего не выводит, но возвращает что-то.
У нас будет следующий test.rb
class TestClass
def self.test_function(some_var)
return "I got the following variable: " + some_var
end
end
Затем, чтобы вызвать это из командной строки и получить возвращаемое значение:
ruby -r "./test.rb" -e "puts TestClass.test_function('hi')"
Ответ 7
Если вы знаете, как вызвать rb файл из командной строки
ruby yourfile.rb
Это может сделать весь трюк для вас.
То, что вы сделали, просто определило ваши методы в классе. Теперь вы можете назвать это ниже определения. Если вы все еще хотите читать, широко открывайте глаза.
class TestClass
def self.test_function(some_var)
puts "I got the following variable: #{some_var}"
end
test_function(var)
end