Beyond Compare 3 , мой любимый, имеет функцию слияния в Pro edition . Хорошая вещь с его слиянием состоит в том, что он позволяет вам видеть все 4 вида: базовый, левый, правый и объединенный результат. Это несколько менее наглядно, чем P4V , но намного больше, чем WinDiff. Он интегрируется со многими системами контроля версий и работает в Windows / Linux. Он имеет много функций, таких как расширенные правила, издания, ручное выравнивание ...
Визуальный клиент Perforce ( P4V ) - это бесплатный инструмент, предоставляющий один из наиболее явных интерфейсов для слияния (см. некоторые скриншоты ). Работает на всех основных платформах. Мое основное разочарование этим инструментом - это своего рода интерфейс «только для чтения» . Вы не можете редактировать файлы вручную и не можете выровнять вручную.
PS: P4Merge включен в P4V. Perforce пытается усложнить получение своего инструмента без клиента.
SourceGear Diff / Merge может быть моим вторым бесплатным выбором инструмента. Проверьте это слияние снимков экрана , и вы увидите, что оно имеет как минимум 3 вида.
Meld - более новый бесплатный инструмент, который я бы предпочел SourceGear Diff / Merge : теперь он также работает на большинстве платформ (Windows / Linux / Mac) с явным преимуществом нативной поддержки некоторого контроля исходного кода, такого как Git . Таким образом, вы можете иметь некоторые различия в истории всех файлов гораздо проще. Представление слияния (см. Скриншот ) имеет только 3 панели, как и SourceGear Diff / Merge . Это усложняет слияние в сложных случаях.
PS: если один инструмент в один прекрасный день поддерживает объединение 5 представлений , это было бы действительно здорово, потому что, если вы делаете коммит вишни в Git, у вас действительно будет не одна база, а две. Два базовых, два изменения и одно результирующее слияние.
: entry
- это символьный литерал, это буквальное значение, такое как 7
или "a строка "
. Здесь нечего определять (кстати, функция не знает имени вашего контроллера).
t
- это параметр блока, который вы передали методу create_tables
. То, что вы здесь написали, примерно аналогично чему-то вроде:
void anonymous_block(Table *t) {
t->string("name");
t->timestamps();
}
...
create_table("entries", &anonymous_block);
в C ++. create_table
вызывает ваш блок и передает ему параметр, который вы назвали t
. Я бы посоветовал вам получить вводную книгу о рубине , а не о рельсах.
Я возьму t
штуку. Метод create_table
похож на функцию C, которая принимает указатель на функцию, которая принимает один аргумент, объект определения таблицы (простите мои несуществующие навыки C):
void entries_table_constructor(TableDef table_definition) {
table_def_add_string_column(table_definition, "name");
table_def_add_timestamps_column(table_definition);
}
create_table("entries", entries_table_constructor);
Но в Ruby определение переданного функция может быть выполнена в момент вызова метода create_table
. Таким образом, бит между do
и end
подобен функции entry_table_constructor
, а переменная t
подобна table_definition
аргумент.
Однако существует большая разница между указателями на функции в C и блоками в Ruby. В Ruby все локальные переменные вне блока доступны внутри блока:
Я работаю над приложением, в котором также есть таблица Entry
модель / записи
. Вот моя миграция:
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
Очень похоже на то, что вы видите.
Во-первых, первая строка, объявляющая класс с именем CreateEntries
, который расширяет ActiveRecord :: Migration
.
Затем объявляем метод класса с именем up ()
. Метод класса, в отличие от метода экземпляра, принадлежит классу, а не конкретным объектам класса. Это ключевое слово « self
», которое делает его методом класса.
Следующий вызов create_table ()
и передача ему двух вещей:
Символ (« ]: entries
"), который, как упоминалось выше, похож на строковый литерал. Это сообщает ActiveRecord, какую таблицу следует вызывать. Допустим, вы набрали этот код вручную - забудьте на минутку о генераторах. Вы набрали ": entries
", потому что знаете, что по соглашению таблицы в приложении Rails именуются множественным числом существительных, и вы знаете, что класс модели, который подключается к этой таблице, будет называться Entry
.
Также передача блока.
Блок может быть заключен в ...
`do ... end`
или в
`{ ... }`
Блок может принимать параметры, заключенные в два " |
". В этом случае метод create_table
передает блоку объект класса TableDefinition
, поэтому, чтобы ответить на один из ваших вопросов, t
- это переменная, содержащая этот объект . Затем внутри блока мы повторный вызов различных методов экземпляра 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
Метод create_table
- это так называемый блок в Ruby, а t
- это локальная переменная. к этому блоку ( t
- это просто соглашение в миграциях Rails, которое означает «таблица»). Это еще один более очевидный пример блока Ruby:
10.times do |i|
print "i is #{i}"
end
: entry
- это символ Ruby, который представляет собой своего рода облегченную строку, которая используется для именования вещей. Вы также могли использовать «записи»
. Одним из распространенных способов использования символов является указание ключей в хэше. В любом случае создаваемая таблица называется "записями".
10.times do |i|
print "i is #{i}"
end
: entry
- это символ Ruby, который представляет собой своего рода облегченную строку, которая используется для именования вещей. Вы также могли использовать «записи»
. Одним из распространенных способов использования символов является указание ключей в хэше. В любом случае создаваемая таблица называется "записями".
10.times do |i|
print "i is #{i}"
end
: entry
- это символ Ruby, который представляет собой своего рода облегченную строку, которая используется для именования вещей. Вы также могли использовать «записи»
. Одним из распространенных способов использования символов является указание ключей в хэше. В любом случае создаваемая таблица называется "записями".
: записи - это ссылка на таблицу записей в Rails.
Мигратор узнал бы об этом, когда была дана команда 'сгенерировать контроллер', насколько я понимаю (работал с Rails профессионально на год, но все еще учусь)
Что касается | t | это блок. Процитируем книгу Pickaxe (копию которой вы должны немедленно получить в формате pdf или мертвом дереве):
Блоки могут использоваться для определения фрагмента кода, который должен выполняться под каким-либо транзакционным контролем. Например, вы часто открываете файл, делаете что-нибудь с его содержимым, а затем хотите убедиться, что файл закрыт, когда вы закончите. Хотя вы можете сделать это с помощью обычного кода, есть аргумент, чтобы заставить файл отвечать за само закрытие. Мы можем сделать это с помощью блоков.
Итак, что? s происходит в том, что | 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_table - это метод, который принимает лямбда-выражение (своего рода делегат), t - аргумент делегата. Итак, когда вы выполняете create_table, он выполняет
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();
}
});
": entries" вообще не определен, это просто идентификатор. Вы можете рассматривать его как простую строку (но не тратите память на сохранение символов).
записи - это ссылка на вашу модель входа - каждая модель предполагает, что имя таблицы будет таким же, как и ее имя, за исключением табличной ( http://api.rubyonrails.org/classes /ActiveSupport/CoreExtensions/String/Inflections.html#M001653)
это параметр блока, переданный в метод create_table, см. http://www.rubycentral.com/book/tut_containers. html в качестве лучшего примера. В данном случае t означает таблицу, которая была создана ( http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M002191 )
Надеюсь, этого будет достаточно, чтобы помочь вы ушли
Это типичное использование блоков в Ruby. Метод create_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
: записи
определяются прямо здесь. Код вызывает метод create_table
с двумя аргументами - желаемое имя таблицы и блок кода.
create_table построит объект TableDefinition
, а затем уступит блок кода, снабжающий его этим объектом. В блоке кода он будет называться t
. И, наконец, этот блок кода вызывает некоторые методы на t
для построения столбцов.
Поскольку, перейдя из Python, я изо всех сил пытался понять эту конструкцию, я дам непифонный перевод вашего фрагмента кода.
Сначала вам нужно определить функцию create_table
как эту (это просто скелет):
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)
Это не то, как это было бы сделано с Python. Если вас интересует, как создать таблицу в Python, вы должны посмотреть, как с этим справляются django или sqlalchemy .