如何从命令行直接调用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
。
答案 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)
答案 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')"