从命令行调用ruby函数

时间:2012-04-25 13:17:02

标签: ruby command-line

如何从命令行直接调用ruby函数?

想象一下,我会有这个脚本 test.rb

class TestClass
    def self.test_function(some_var)
        puts "I got the following variable: #{some_var}"
    end
end

如果从命令行(ruby test.rb)运行此脚本,则不会发生任何事情(按预期)。

有类似ruby test.rb TestClass.test_function('someTextString')的内容吗? 我想获得以下输出:I got the following variable: someTextString

7 个答案:

答案 0 :(得分:85)

首先,类的名称需要以大写字母开头,因为您确实想使用静态方法,所以函数名称定义需要以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'"

答案 1 :(得分:12)

这是另一个变体,如果你发现在命令行输入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数组设置为传递给脚本的参数。您可以使用ARGV[0]ARGV.first来获取第一个参数,也可以使用ARGV.join(' ')将args组合成单个字符串,用空格分隔。

如果你正在做很多命令行的事情,你最终可能会使用Shellwords,这是标准的ruby lib。

答案 2 :(得分:3)

#!/usr/bin/env ruby

class A
  def run
    p :Hello_world
  end
  self
end.new.run

编写Ruby脚本的常用方法是使用名为 main的顶级执行环境您可以开始定义在类之外编写的方法和代码,这些将直接执行。 (顺便说一句,类中的代码但在任何方法之外也会“自行”运行。)

无论如何,我和你在一起...我喜欢在命名类中编写所有代码并实例化该类,因此你可以结合这些技术..让类返回自己的对象..然后使用一点点该顶级代码分配,初始化,然后点到该类。

有了这个,您只需输入$ ruby test.rb即可。或者你可以chmod +x test.rb; ./test.rb我们add a shebang.

答案 3 :(得分:3)

如果你有多个参数可以在这样的例子中调用:

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'"

答案 4 :(得分:2)

如果您正在使用命令行界面,那么我建议您查看thor

Thor直接将您的命令映射到已定义类中的方法,有关示例,请参阅thor wiki

答案 5 :(得分:1)

如果您知道如何从命令行调用rb文件

#define _BSD_SOURC #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <fcntl.h> #include <termios.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <string.h> #include<unistd.h> struct cord { int sw; int x_axis; int y_axis; }; void mouseMove(struct cord* s1) { Display *displayMain = XOpenDisplay(NULL); if(displayMain == NULL) { fprintf(stderr, "Errore nell'apertura del Display !!!\n"); exit(EXIT_FAILURE); } //XWarpPointer(displayMain, None, None, 0, 0, 0, 0, s1.x_axis, s1.y_axis); XCloseDisplay(displayMain); } struct cord* decode(char *buffer) { struct cord* s1 = malloc(sizeof(struct cord)); s1->sw=0; s1->x_axis=0; s1->y_axis=0; if(strcmp(buffer,"error")!=1) { s1->sw=buffer[0]-'0'; int i=2; while(buffer[i]!=',') { s1->x_axis=s1->x_axis*10+(buffer[i]-'0'); i++; } i++; while(buffer[i]!='*'||buffer[i]=='\0') { s1->y_axis=s1->y_axis*10+(buffer[i]-'0'); i++; } s1->x_axis=-s1->x_axis+497; s1->y_axis=s1->y_axis-497; //printf("%d %d %d\n",s1.sw,s1.x_axis/50,s1.y_axis/50); } return s1; } char* arread(int fd) { ssize_t n,n1; char* buf=(char *)malloc(128*sizeof(char)); char*ch=(char *)malloc(sizeof(char)); while(ch[0]!='\n') { n1=read(fd,ch,1); } n = read(fd, buf, 12); buf[n]='\0'; printf("\n%zd\n", n); printf("%s\n", buf); if(n>0) { return buf; } else { printf("error"); return "error"; } int main() { int fd; char *portname = "/dev/ttyACM0"; fd = open(portname, O_RDWR | O_NOCTTY); if(fd==-1) { close(fd); printf("erip"); } else { struct termios toptions; if(tcgetattr(fd, &toptions)==0) { if(cfsetispeed(&toptions, B9600)==0) { if(cfsetospeed(&toptions, B9600)==0) { toptions.c_cflag &= (unsigned int)~PARENB; toptions.c_cflag &= (unsigned int)~CSTOPB; toptions.c_cflag &= (unsigned int)~CSIZE; toptions.c_cflag |= (unsigned int)CS8; toptions.c_cflag &= (unsigned int)~CRTSCTS; toptions.c_cflag |= (unsigned int)CREAD | (unsigned int)CLOCAL; toptions.c_iflag &= (unsigned int)~(IXON | IXOFF | IXANY); toptions.c_lflag &= (unsigned int)~(ICANON | ECHO | ECHOE | ISIG); toptions.c_oflag &= (unsigned int)~OPOST; toptions.c_cc[VMIN] = 12; toptions.c_cc[VTIME] = 0; if(tcsetattr(fd, TCSANOW, &toptions)==0) { //int i=0; //while(i<5) //{ mouseMove(decode(arread(fd))); //i++; //} } else printf("error 4"); } else printf("error 3"); } else printf("error 2"); } else printf("error 1"); } }

这可以为你完成整个技巧。

你所做的就是在课堂上定义你的方法。现在你可以在定义下面调用它。如果你还想阅读,请睁大眼睛

ruby yourfile.rb

答案 6 :(得分:0)

只是对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')"