Это должно сработать:
MatchResult findNthOccurance(int n, Pattern p, CharSequence src){
Matcher m = p.matcher(src);
for(int i = 0; i<n; i++) m.find();
return m;
}
По сути, он просто вызывает find несколько раз на Matcher, полученном из Pattern. Удобно, что Matcher также является MatchResult, поэтому я могу просто вернуть его прямо вверх.
Try this:
var instance = {};
MyClass.apply( instance, r);
All the keyword "new" does is pass in a new object to the constructor which then becomes the this variable inside the constructor function.
Depending upon how the constructor was written, you may have to do this:
var instance = {};
var returned = MyClass.apply( instance, args);
if( returned != null) {
instance = returned;
}
Update: A comment says this doesn't work if there is a prototype. Try this.
function newApply(class, args) {
function F() {
return class.apply(this, args);
}
F.prototype = class.prototype;
return new F();
}
newApply( MyClass, args);
One possibility is to make the constructor work as a normal function call.
function MyClass(arg1, arg2) {
if (!(this instanceof MyClass)) {
return new MyClass(arg1, arg2);
}
// normal constructor here
}
The condition on the if
statement will be true if you call MyClass
as a normal function (including with call
/apply
as long as the this
argument is not a MyClass object
).
Now all of these are equivalent:
new MyClass(arg1, arg2);
MyClass(arg1, arg2);
MyClass.call(null, arg1, arg2);
MyClass.apply(null, [arg1, arg2]);
what about a workaround?
function MyClass(arg1, arg2) {
this.init = function(arg1, arg2){
//if(arg1 and arg2 not null) do stuff with args
}
init(arg1, arg2);
}
So how you can:
var obj = new MyClass();
obj.apply(obj, args);
Кодовая база проекта Continuum не слишком велика. Попробуйте создать новый проект в Visual C # Express и импортировать код вручную. Возможно, вам придется добавить некоторые ссылки, прежде чем вы сможете успешно строить.
Редактировать:
Я только что сделал это с проектом Continuum.
Далее Редактировать :
Вот разница в Unix неотредактированных файлов sln и csproj Continuum по сравнению с теми, которые я создаю, используя процесс, упомянутый выше. (Я объединил файл вручную, чтобы выявить реальные различия.) (Игнорировать подсветку синтаксиса.)
6c6
<ProductVersion>9.0.21022</ProductVersion>
---
<ProductVersion>9.0.30729</ProductVersion>
8c8
<ProjectGuid>{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}</ProjectGuid>
---
<ProjectGuid>{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}</ProjectGuid>
13c13
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
---
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
37a38,46
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
225c234
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
---
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
3,4c3,4
# Visual Studio 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Continuum", "Continuum.csproj", "{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}"
---
# Visual C# Express 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Continuum", "Continuum.csproj", "{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}"
12,15c12,15
{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD0F9C26-38BF-473F-8FD4-FDB1C7BEA600}.Release|Any CPU.Build.0 = Release|Any CPU
---
{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E3E4FFA5-0EC3-4F94-B842-33C7A49B7FF5}.Release|Any CPU.Build.0 = Release|Any CPU
Вы заметите что файлы существенно не отличаются и, как отмечено в комментариях к этому ответу, я могу фактически открыть, скомпилировать и запустить неотредактированный проект Continuum 1.1.1! Похоже, проблема может быть в вопросе 9.0.30729.1 SP Microsoft .NET Framework версии 3.5 SP1
Установленное издание: C # Express
Microsoft Visual C # 2008
91910-152-0000061-60588 Microsoft
Visual C # 2008
Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB945282) KB945282 Для более информация, визит http://support.microsoft.com/kb/945282 .
Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB946040) KB946040 Для более информация, визит http://support.microsoft.com/kb/946040 .
Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB946308) KB946308 Для более информация, визит http://support.microsoft.com/kb/946308 .
Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB947540) KB947540 Для более информация, визит http://support.microsoft.com/kb/947540 .
Исправление для Microsoft Visual C # 2008 Экспресс-выпуск с SP1 - ENU (KB947789) KB947789 Для более информация, визит http://support.microsoft.com/kb/947789 .
Название ОС Microsoft Windows Vista Версия 6.0.6001 Сервис Еще одна вещь, на которую следует обратить внимание - попробуйте создать экземпляры одного и того же типа с помощью этих различных методов, а затем проверить, совпадают ли их свойства конструктора, - вы можете захотеть, чтобы это было так, если вам когда-либо понадобится проверить тип объекта. То, что я имею в виду, лучше всего иллюстрируется следующим кодом:
function Person(firstName, lastName) {
this.FirstName = firstName;
this.LastName = lastName;
}
var p1 = new Person("John", "Doe");
var p2 = Person.build(["Sara", "Lee"]);
var areSameType = (p1.constructor == p2.constructor);
Попробуйте это с некоторыми другими взломами и посмотрите, что произойдет. В идеале вы хотите, чтобы они были одного типа.
CAVEAT: как отмечено в комментариях, это не будет работать для тех функций конструктора, которые созданы с использованием синтаксиса анонимных функций, то есть
MyNamespace.SomeClass = function() { /*...*/ };
Если вы не создадите их как это:
MyNamespace.SomeClass = function SomeClass() { /*...*/ };
Решение, которое я предоставил выше, может или не может быть полезным для вас, вам нужно точно понимать, что вы делаете, чтобы найти лучшее решение для ваших конкретных потребностей, и вы должны быть в курсе происходящего сделать мое решение
Обратите внимание, что
новый myClass ()
без аргументов может завершиться ошибкой, поскольку функция-конструктор может полагаться на существование аргументов.
myClass.apply (something, args)
не работает во многих случаях, особенно если вызывается в собственных классах, таких как Date или Number.
Я знаю, что "eval - это зло", но в этом случае вы можете попробовать следующее:
function newApply(Cls, args) {
var argsWrapper = [];
for (var i = 0; i < args.length; i++) {
argsWrapper.push('args[' + i + ']');
}
eval('var inst = new Cls(' + argsWrapper.join(',') + ');' );
return inst;
}
Все просто .
(Работает так же, как Instance.New
в этом сообщении в блоге )