Можно ли объяснить, что продолжается в этом коде Ruby?

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, у вас действительно будет не одна база, а две. Два базовых, два изменения и одно результирующее слияние.

6
задан John Topley 4 July 2009 в 18:20
поделиться

10 ответов

: 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 . Я бы посоветовал вам получить вводную книгу о рубине , а не о рельсах.

9
ответ дан 8 December 2019 в 16:09
поделиться

Я возьму 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 все локальные переменные вне блока доступны внутри блока:

2
ответ дан 8 December 2019 в 16:09
поделиться

Я работаю над приложением, в котором также есть таблица 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 () и передача ему двух вещей:

  1. Символ (« ]: entries "), который, как упоминалось выше, похож на строковый литерал. Это сообщает ActiveRecord, какую таблицу следует вызывать. Допустим, вы набрали этот код вручную - забудьте на минутку о генераторах. Вы набрали ": entries ", потому что знаете, что по соглашению таблицы в приложении Rails именуются множественным числом существительных, и вы знаете, что класс модели, который подключается к этой таблице, будет называться Entry .

  2. Также передача блока.

Блок может быть заключен в ...

`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
1
ответ дан 8 December 2019 в 16:09
поделиться

Метод create_table - это так называемый блок в Ruby, а t - это локальная переменная. к этому блоку ( t - это просто соглашение в миграциях Rails, которое означает «таблица»). Это еще один более очевидный пример блока Ruby:

10.times do |i|
  print "i is #{i}"
end

: entry - это символ Ruby, который представляет собой своего рода облегченную строку, которая используется для именования вещей. Вы также могли использовать «записи» . Одним из распространенных способов использования символов является указание ключей в хэше. В любом случае создаваемая таблица называется "записями".

migrations, что означает «таблица»). Это еще один более очевидный пример блока Ruby:

10.times do |i|
  print "i is #{i}"
end

: entry - это символ Ruby, который представляет собой своего рода облегченную строку, которая используется для именования вещей. Вы также могли использовать «записи» . Одним из распространенных способов использования символов является указание ключей в хэше. В любом случае создаваемая таблица называется "записями".

migrations, что означает «таблица»). Это еще один более очевидный пример блока Ruby:

10.times do |i|
  print "i is #{i}"
end

: entry - это символ Ruby, который представляет собой своего рода облегченную строку, которая используется для именования вещей. Вы также могли использовать «записи» . Одним из распространенных способов использования символов является указание ключей в хэше. В любом случае создаваемая таблица называется "записями".

1
ответ дан 8 December 2019 в 16:09
поделиться

: записи - это ссылка на таблицу записей в 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
1
ответ дан 8 December 2019 в 16:09
поделиться

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" вообще не определен, это просто идентификатор. Вы можете рассматривать его как простую строку (но не тратите память на сохранение символов).

1
ответ дан 8 December 2019 в 16:09
поделиться

записи - это ссылка на вашу модель входа - каждая модель предполагает, что имя таблицы будет таким же, как и ее имя, за исключением табличной ( 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 )

Надеюсь, этого будет достаточно, чтобы помочь вы ушли

0
ответ дан 8 December 2019 в 16:09
поделиться

Это типичное использование блоков в 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
0
ответ дан 8 December 2019 в 16:09
поделиться

: записи определяются прямо здесь. Код вызывает метод create_table с двумя аргументами - желаемое имя таблицы и блок кода.

create_table построит объект TableDefinition , а затем уступит блок кода, снабжающий его этим объектом. В блоке кода он будет называться t . И, наконец, этот блок кода вызывает некоторые методы на t для построения столбцов.

0
ответ дан 8 December 2019 в 16:09
поделиться

Поскольку, перейдя из 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 .

0
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: