Действительно ли возможно взорвать массив так, чтобы его элементы могли быть переданы методу с ключевым словом параметрических усилителей?

Попробуйте обернуть вашу еду в цикл for + if:

var foodNotPlaced;

snake.forEach(function(segment) {
    if (food.x != segment.x and food.y != segment.y) {
    ctx.fillStyle = 'red';
    ctx.fillRect(food.x, food.y, unit, unit);
    foodNotPlaced = false;
    }
    else {
    food.x = Math.floor(Math.random()*((cvsW/unit)-1)+1)*unit;
    food.y = Math.floor(Math.random()*((cvsW/unit)-1)+1)*unit;
    foodNotPlaced = True;
});

Затем перезапустите цикл while, чтобы убедиться, что еда размещена до выполнения остальной части кода

[ 111]
5
задан Mark Cidade 12 October 2008 в 13:09
поделиться

5 ответов

Одна опция состоит в том, чтобы сделать params параметр object[]:

static string appendFolders(params object[] folders)
 { return (string) folders.Aggregate("",(output, f) => 
                       Path.Combine( (string)output
                                    ,(f is string[]) 
                                      ? appendFolders((object[])f)
                                      : ((string)f).TrimStart('\\')));
 }

Если Вы хотите что-то более со строгим контролем типов, другая опция состоит в том, чтобы создать тип таможенного союза с неявными операторами преобразования:

  static string appendFolders(params StringOrArray[] folders)
     { return folders.SelectMany(x=>x.AsEnumerable())
                     .Aggregate("",
                       (output, f)=>Path.Combine(output,f.TrimStart('\\')));
     }

   class StringOrArray
     { string[] array;

       public IEnumerable<string> AsEnumerable()
        { return soa.array;}

       public static implicit operator StringOrArray(string   s)   
        { return new StringOrArray{array=new[]{s}};}

       public static implicit operator StringOrArray(string[] s)  
        { return new StringOrArray{array=s};}
     }

В любом случае это скомпилирует:

appendFolders("base", "v1", "module", new[]{"debug","bin"});
1
ответ дан 13 December 2019 в 05:44
поделиться

Просто передайте его. Параметр папок является массивом сначала. "params" функциональность является определенным волшебством компилятора, но это не требуется.

AppendFolders(extraFolders);

Теперь, это этот экземпляр макрочастицы, необходимо будет добавить некоторые вещи к тому массиву, сначала.

List<string> lstFolders = new List<string>(extraFolders);
lstFolder.Insert(0, callingModule);
lstFolder.Insert(0, version);
lstFolder.Insert(0, basefolder);
return AppendFolders(lstFolders.ToArray());
7
ответ дан 13 December 2019 в 05:44
поделиться

Я придерусь с термином "коллапс", так как кажется, что Вы действительно хотите "расшириться". И я не уверен, что Вы подразумеваете под решениями, "имеющими отношение непосредственно к ключевому слову параметрических усилителей" и что "Вы не интересуетесь обходными решениями". В конце или необходимо передать много строк - который компилятор волшебно упакует в массив - или массив строк непосредственно. Однако мое решение (не изменяя интерфейс) пошло бы что-то как:

return AppendFolders(new string[] { basefolder, version, callingModule }.Concat(extraFolders).ToArray());

Править:

В то время как Вы не можете добавить оператор с помощью дополнительных методов, Вы могли сделать:

return AppendFolders(new string[] { baseFolder, callingModuleName, version }.Concat(extraFolders));

public static T[] Concat<T>(this T[] a, T[] b) {
   return ((IEnumerable<T>)a).Concat(b).ToArray();
}

Но, если мы собираемся пойти, что далеко - мог бы также просто расширить Список <T> для обработки этого изящно:

return AppendFolders(new Params<string>() { baseFolder, callingModuleName, version, extraFolders });

class Params<T> : List<T> {
    public void Add(IEnumerable<T> collection) {
       base.AddRange(collection);
    }

    public static implicit operator T[](Params<T> a) {
       return a.ToArray();
    }
}
2
ответ дан 13 December 2019 в 05:44
поделиться

Быстрое и грязное решение состояло бы в том, чтобы создать Список <строка> из объектов и затем передать это (с ToArray ()).

Обратите внимание, что Вы не должны тестировать на обратную косую черту. Путь. Объединение обрабатывает грязные довольно прекрасные вещи.

1
ответ дан 13 December 2019 в 05:44
поделиться

Я думаю, что ответ OregonGhost является, вероятно, путем, которым Вы хотите пойти. Только для разработки его он предлагает делать что-то вроде этого:

public string GetPath(string basefolder, string[] extraFolders)
{
    string version = Versioner.GetBuildAndDotNetVersions();
    string callingModule = StackCrawler.GetCallingModuleName();

    List<string> parameters = new List<string>(extraFolders.Length + 3);
    parameters.Add(basefolder);
    parameters.Add(version);
    parameters.Add(callingModule);
    parameters.AddRange(extraFolders);
    return AppendFolders(parameters.ToArray());
}

И я не подразумеваю, что как урок по тому, как использовать Списки, так же мало разъяснения для кого-либо, кто может приехать, ища решение в будущем.

1
ответ дан 13 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

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