Подтвердить что ты не робот

Вызов функции 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.

4b9b3361

Ответ 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