Ruby on rails 你能解释一下';这个Ruby代码中发生了什么?
我现在正在努力学习Ruby以及RubyonRails。我正在学习Rails第1版,但我很难理解其中的一些代码 我一般都用C、C++或java工作,所以露比对我来说是个很大的变化。 我目前被数据库迁移器的以下代码块难住了:Ruby on rails 你能解释一下';这个Ruby代码中发生了什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我现在正在努力学习Ruby以及RubyonRails。我正在学习Rails第1版,但我很难理解其中的一些代码 我一般都用C、C++或java工作,所以露比对我来说是个很大的变化。 我目前被数据库迁移器的以下代码块难住了: def self.up create_table :entries do |t| t.string :name t.timestamps end end t变量来自哪里?它实际上代表什么?它有点像for(i=0;icreate_
def self.up
create_table :entries do |t|
t.string :name
t.timestamps
end
end
t变量来自哪里?它实际上代表什么?它有点像for(i=0;icreate_table)中的“i”吗?create_table是一个接受lambda表达式(某种委托)的方法,t是委托的参数
t.string :name
t.timestamps
类似伪代码的东西
delegate d = funciton (t) {
t.string :name
t.timestamps
}
create_table(d);
java中的直接模拟是一个非常简单的类
addReturnBackListener(new Listener<EventObject>() {
public void handle(EventObject e) {
refreshAndShowAndList();
}
});
addReturnBackListener(新侦听器(){
公共无效句柄(EventObject e){
refreshAndShowAndList();
}
});
“:entries”根本没有定义,它只是一个标识符。您可以将其视为简单的字符串(但不需要花费内存来保存字符)。我将采用
t
方法。create\u table
方法就像一个C函数,它采用一个函数指针,该指针包含一个参数,即表定义对象(请原谅我不存在的C技能):
但在Ruby中,传递函数的定义可以在调用create\u table
方法时完成。因此do
和end
之间的位类似于entries\u table\u构造函数
函数,t
变量类似于table\u definition
参数
然而,C中的函数指针和Ruby中的块之间有很大的区别。在Ruby中,块外的所有局部变量都在块内可用:
a = 10
create_table :entries do |t|
puts a
...
end
查看Ruby中的
yield
关键字,了解如何编写自己的方法,如create\u table
,这是Ruby中块的典型用法。方法create\u table在ActiveRecord中定义如下:
def create_table(table_name)
table_object = some_table_setup
yield(table_object) # your code block which was passed implicitly is invoked here
create_table(table_object)
end
:entries
是一个符号文字,它是一个文字值,类似于7
或“字符串”
。无需定义(顺便说一句,函数不知道控制器的名称)
t
是传递给create\u tables
方法的块的参数。您在这里编写的内容大致类似于:
void anonymous_block(Table *t) {
t->string("name");
t->timestamps();
}
...
create_table("entries", &anonymous_block);
< C++ > .>代码> CuraTyTabe> /Cuff>调用您的块并传递一个参数,您已经命名为“代码> t< /COD>”。我建议您得到Ruby的入门书,而不是Rails。我推荐Ruby为Rails提供David A. Black。
:条目引用Rails中的条目表。
据我所知,当“generate controller”命令发出时,迁移者就会知道这一点(与Rails专业合作了一年,但仍在学习) 至于| t |这是一个块。引用鹤嘴锄书(你应该立即获得pdf或枯树版本的副本): 块可用于定义必须在某种事务控制下运行的代码块。例如,您通常会打开一个文件,对其内容执行某些操作,然后希望确保在完成时关闭该文件。尽管您可以使用常规代码执行此操作,但仍有理由让该文件负责自动关闭。我们可以用块来完成 因此,上面所说的是| t |是一个块,它负责建立到数据库的连接,根据行的特定类型创建行,然后关闭连接 下面是另一个例子:output_string = "Let's print this to file"
File.open('outputfile.txt','w') do |f| #f for file
f.print output_string
end
对于迭代器,是的,您也可以这样做:
an_array = [1,2,3,4]
an_array.each do |line|#line is the block for the elements of the array during iteration
puts "Now we are at: #{line.to_s}!"
end
create\u table
方法在Ruby中被称为块,t
是该块的局部变量(t
只是Rails迁移中的一个约定,代表“table”)。这是Ruby块的另一个更明显的例子:
10.times do |i|
print "i is #{i}"
end
:entries
是一个Ruby符号,这是一种用于命名事物的轻量级字符串。您可以同样使用“entries”
。符号的一个常见用途是指定哈希中的键。在任何一种情况下,创建的表都被命名为“entries”.条目是对条目模型的引用-每个模型都假定表名与其名称相同,只是表化了()
t是一个传递到create_table方法的块参数,请参阅以获得更好的示例。在本例中,t表示已创建的表()
希望这足以帮助您我碰巧正在开发一款应用程序,它也有一个
条目
模型/条目
表。以下是我的迁移:
class CreateEntries < ActiveRecord::Migration
def self.up
create_table :entries do |t|
t.string :title
t.text :entry
# ...
end
end
def self.down
drop_table :entries
end
end
或者
一个块可以采用由两个“|
”括起的参数s、 在本例中,create\u table
方法将类TableDefinition
的对象传递给块,因此为了回答您的一个问题,t
是保存该对象的var。然后在块内,我们调用TableDefinition
的各种实例方法
TableDefinition
对象来自何处?发生在create_table()
方法中。它包含实例化新TableDefinition
对象并将其“产生”到块的代码
ActiveRecord源代码
def create_table(table_name, options = {})
table_definition = TableDefinition.new(self)
table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false
yield table_definition
# ...
end
:
entries
就在那里定义。代码正在调用方法create_table
,其中包含两个参数—所需的表名和一块代码
create\u table将构造一个
TableDefinition
对象,然后屈服于代码块,将该对象提供给它。在代码块中,它将被命名为t
。最后,该代码块调用t
上的一些方法来构建列。因为来自Python,我很难理解这种结构米斯酒店
`do ... end`
`{ ... }`
def create_table(table_name, options = {})
table_definition = TableDefinition.new(self)
table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false
yield table_definition
# ...
end
def create_table(name, setup):
t = Table(name)
setup(t)
def setup_entries(t): # <-- here is your |t|, just a function argument
t.string("name")
t.timestamps()
create_table("entries", setup_entries)