On 12/31/2012 08:11 AM, RollingCat wrote:
Hi there. I'm new to D language and make a simple software monitoring
new file with specified extension.
class FileList
{
str_CurrentDir;
bool ReturnMatchedFile(string str_arg_filename, string str_Extension)
{
return endsWith(str_arg_filename, '.'~str_Extension);
}
void GetCurrentList(string str_arg_Extension)
{
auto filter_CurrentList=filter!ReturnMatchedFile(str_arg_Extension,
dirEntries(str_CurrentDir, SpanMode.shallow));
}
}
with this FileList class, after making instance of FileList and
assigning str_CurrentDir variable, when I call GetCurrentList("d"), it
says that std.algorithm.filter! ~~ does not match any function template
declaration.
OK. So I modified above code like below just for a test.
class FileList
{
str_CurrentDir;
bool ReturnMatchedFile(string str_arg_filename)
{
return endsWith(str_arg_filename, ".d");
}
void GetCurrentList()
{
auto
filter_CurrentList=filter!ReturnMatchedFile(dirEntries(str_CurrentDir,
SpanMode.shallow));
}
}
And it says that
this for ReturnMatchedFile needs to be type FileList not type
FileResult!(ReturnMatchedFile, DirIterator).
I can't understand it!
Anyway, to solve the problem, again, I modified above code like below.
static bool ReturnMatchedFile(string str_arg_filename)
{
return endsWith(str_arg_filename, ".d");
}
class FileList
{
str_CurrentDir;
void GetCurrentList()
{
auto
filter_CurrentList=filter!ReturnMatchedFile(dirEntries(str_CurrentDir,
SpanMode.shallow));
}
}
and it works.
What is the problem?
Best regards and happy new year! :)
It is very helpful to see complete code. If I guessed it right, the
following works:
import std.algorithm;
import std.file;
class FileList
{
string str_CurrentDir;
bool ReturnMatchedFile(string str_arg_filename, string str_Extension)
{
return endsWith(str_arg_filename, '.'~str_Extension);
}
void GetCurrentList(string str_arg_Extension)
{
auto filter_CurrentList =
filter!(a => ReturnMatchedFile(a, str_arg_Extension))
(dirEntries(str_CurrentDir, SpanMode.shallow));
}
}
void main()
{
auto f = new FileList();
}
The problem was that you did not provide the template argument
parentheses to filter. You can omit them only if there is only one word.
I have used the lambda syntax as described here:
http://dlang.org/expression.html#Lambda
Each element of dirEntries() appears to the lambda as its 'a' parameter.
That parameter is then applied to the right-hand side of the => operator.
Unrelated to the question, I recommend that you don't use prefixes like
'str_' and 'arg_'; they make the code harder to read. For example, I
would like 'desired_extension' better than 'str_arg_Extension', because
it would carry its meaning better.
Also, predicates like ReturnMatchedFile() are usually named like
hasMatchingExtension().
Ali
--
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html