Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 自制公式语法_Ruby_Syntax_Homebrew - Fatal编程技术网

Ruby 自制公式语法

Ruby 自制公式语法,ruby,syntax,homebrew,Ruby,Syntax,Homebrew,我很难理解自制公式的语法 让我们看看这个例子: require "formula" class Foo < Formula url "http://example.com/foo-0.1.tar.gz" homepage "" sha1 "1234567890ABCDEF1234567890ABCDEF" # depends_on "cmake" => :build def install system "./configure", "--prefi

我很难理解自制公式的语法

让我们看看这个例子:

require "formula"

class Foo < Formula
  url "http://example.com/foo-0.1.tar.gz"
  homepage ""
  sha1 "1234567890ABCDEF1234567890ABCDEF"

  # depends_on "cmake" => :build

  def install
    system "./configure", "--prefix=#{prefix}", "--disable-debug", "--disable-dependency-tracking"
#   system "cmake", ".", *std_cmake_args
    system "make install"
  end
end
这是一种变量赋值吗?url对象的构造? 很抱歉,在读完整个Ruby教程之后,我仍然不理解它

此外,请尝试解释此语法是什么:

system "make install"

根据我的搜索,Ruby没有这样的方法(或者至少它没有像这样调用system()方法)。

你会发现这些都是对Foo派生的公式类的方法的调用(
Foo
)。例如,让您感到困惑的
system
方法只是在公式中调用的一个方法。浏览一下,你会找到你的大部分答案

自制是一个复杂的程序,正如您所期望的那样,它的功能在不同的对象之间很好地分离。因此,您可能需要将一些调用跟踪到其他对象中。例如,虽然
Formula
确实有一个
url
方法,而这正是您所询问的
url
所调用的,但您会发现该调用被传递给一个对象,然后该对象将其存储在一个实例变量中,并将其添加到依赖项收集器中

此外,请尝试解释此语法是什么:

system "make install"
根据我的搜索,Ruby没有这样的方法(或者至少没有) 它不会像这样调用system()方法)

Ruby实际上有一个system()方法,其调用方式与此完全相同,请参见:

例如,运行以下程序:

system "ls *"
然而,在ruby中,如果一个方法没有显式接收器,那么ruby隐式地使用任何对象
self
来调用该方法,即self.system(…)

在类内部,但在任何def之外,self是类:

class Dog
  p self  #=>Dog
end
在实例方法中:

class Dog

  def bark
    p self
    puts 'woof'
  end

end

d = Dog.new
d.bark

--output:--
#<Dog:0x00000100a40280>
woof
最好对自己说,
self.system(…)哪个对象是self?
您的代码可以归结为:

class Foo < Formula
  def install
    system(...)
  end
end
Ruby将其翻译为:

self.url(""http://example.com/foo-0.1.tar.gz")

谢谢你的快速回答!这非常令人惊讶,因为在Cookbook公式“编码风格”中,它表明方法调用应该使用括号system(“makeinstall”)而不是system“makeinstall”。这样写被认为是好的编码风格吗?当选择一种风格而不是另一种风格时,需要考虑什么。很抱歉我坚持,但我真的很想理解这一点。谢谢!恐怕我对这本食谱的编码风格知之甚少。一般的Ruby建议似乎倾向于在方法调用中使用括号(例如“…优先级规则会使我们很难知道哪个参数与哪个方法调用相匹配,所以我们建议在除了最简单的情况之外的所有情况下都使用括号。”-Dave Thomas的编程Ruby),但我看到它们被省略了,特别是在像自制软件和Capistrano这样的情况下,“程序”更像是一个配置文件。@cyberjoac,我认为有经验的rubyists喜欢炫耀并省略方法调用的括号,但在我看来,这使代码很难阅读,所以我使用parenetheses…然而,所有rubyists都写
放“hello”
,not
put('hello')
p一些数组
not
p(一些数组)
。我也使用python,从2.x版切换到3.x版需要
print('hello')
而不是
print'hello'
,我绝对不能忍受必须在python 3.x中编写括号,我认为这是Python3.x的一个主要缺陷……Ruby也用于dsl,许多dsl都是通过省略dsl语法指南中的括号来隐藏方法调用的。一般来说,我想我的规则是:如果键入括号对我来说太烦人了,那么我就省略它们,否则我就包括它们。
class Foo < Formula
  def install
    system(...)
  end
end
What exactly does the following syntax means?

    url "http://example.com/foo-0.1.tar.gz"
self.url(""http://example.com/foo-0.1.tar.gz")