有没有办法(ab)使用C预处理器来模拟C中的命名空间?
我正在考虑以下几点:
#define NAMESPACE name_of_ns
some_function() {
some_other_function();
}
Run Code Online (Sandbox Code Playgroud)
这将被翻译为:
name_of_ns_some_function() {
name_of_ns_some_other_function();
}
Run Code Online (Sandbox Code Playgroud) 我把它作为xml:
<root xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
<event:event>
<event:sessionKey></event:sessionKey>
<event:sessionName>Learn QB in Minutes</event:sessionName>
<event:sessionType>9</event:sessionType>
<event:hostWebExID></event:hostWebExID>
<event:startDate>02/12/2009</event:startDate>
<event:endDate>02/12/2009</event:endDate>
<event:timeZoneID>11</event:timeZoneID>
<event:duration>30</event:duration>
<event:description></event:description>
<event:status>NOT_INPROGRESS</event:status>
<event:panelists></event:panelists>
<event:listStatus>PUBLIC</event:listStatus>
</event:event>
...
</root>
Run Code Online (Sandbox Code Playgroud)
我如何遍历所有事件:事件节点和显示,例如,所有事件:SessionKey?
这不起作用:
$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
foreach($xml->xpath('//e:event') as $event) {
var_export($event->xpath('//e:sessionKey'));
}
Run Code Online (Sandbox Code Playgroud) 我们目前在一个项目中有很多类,每个类都实现一个接口,主要是出于DI的原因.
现在,我个人的感觉是这些接口应该放在同一个程序集中的一个单独的命名空间中(所以我们有一个MyCompany.CoolApp.DataAccess程序集,并且在其中有一个Interfaces命名空间给出 MyCompany.CoolApp.DataAccess.Interfaces).
但是,有人建议这些接口实际上应该在它们自己的程序集中.我的问题是 - 他们是对的吗?我可以看到有一些好处(例如,其他项目只需要使用接口程序集),但在一天结束时,所有这些程序集都需要加载.在我看来,可能会有一个稍微复杂的部署问题,因为Visual Studio不会自动将实现程序集拉入目标的bin文件夹.
是否有针对此的最佳实践指南?
编辑:
为了使我的观点更清楚:我们已经将UI,DataAccess,DataModel和其他东西分成不同的程序集.我们当前也可以毫不费力地将我们的实现换成不同的实现,因为我们使用Unity(IOC框架)将实现类映射到接口.我应该指出,除了多态性的原因和为单元测试创建模拟之外,我们从不编写同一接口的两个实现.因此,除了单元测试之外,我们目前没有"换出"实现.
我看到在与实现相同的程序集中使用接口的唯一缺点是将加载整个程序集(包括未使用的实现).
但是,我可以看到将它们放在不同的程序集中意味着开发人员不会意外地"新"实现类而不是使用IOC包装器创建它.
我从答案中无法理解的一点是部署问题.如果我只是依赖于接口程序集,我会有类似以下结构的东西:
MyCompany.MyApplication.WebUI
References:
MyCompany.MyApplication.Controllers.Interfaces
MyCompany.MyApplication.Bindings.Interfaces
etc...
Run Code Online (Sandbox Code Playgroud)
当我构建它时,自动放入bin文件夹的程序集就是那些接口程序集.但是,我在单元格中的类型映射将不同的接口映射到它们的实际实现.包含我的实现的程序集如何最终在bin文件夹中?
在一些__init__.py模块文件中,我看到了这样的单行:
__import__('pkg_resources').declare_namespace(__name__)
Run Code Online (Sandbox Code Playgroud)
它做了什么以及为什么人们使用它?假设它与在运行时动态导入和创建命名空间有关.
我有非常基本的问题.在L4中,下面的方法开箱即用,所以现在我迷路了.请帮忙.几天前,我开始了一个Laravel 5.0项目.我现在有新鲜,干净的安装.
问题1:当我尝试从数据库中获取任何内容时
$headquote = DB::table('quotation_texts')->find(176);
Run Code Online (Sandbox Code Playgroud)
我明白了:
Class 'App\Http\Controllers\DB' not found
Run Code Online (Sandbox Code Playgroud)
问题2:在克隆User.php模型之前,将类名更改为"Quotation".下面是放在App根文件夹中的文件Quotations.php的内容:
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Quotation extends Model {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'quotation_texts';
}
Run Code Online (Sandbox Code Playgroud)
任何尝试使用该模型
$headquote = Quotation::find(176);
Run Code Online (Sandbox Code Playgroud)
最终得到这个:
Class 'App\Http\Controllers\Quotation' not found
Run Code Online (Sandbox Code Playgroud)
我有什么想法可以解决这个问题?
这个(化妆)问题最初是作为一个谜题制定的,隐藏了一些可能有助于更快地看到问题的细节.向下滚动以查看更简单的MCVE版本.
我有这段代码输出0:
#include <iostream>
#include <regex>
using namespace std;
regex sig_regex("[0-9]+");
bool oldmode = false;
template<class T>
struct B
{
T bitset;
explicit B(T flags) : bitset(flags) {}
bool foo(T n, string s)
{
return bitset < 32 // The mouth is not full of teeth
&& 63 > (~n & 255) == oldmode // Fooness holds
&& regex_match(s, sig_regex); // Signature matches
}
};
template<class T>
struct D : B<T>
{
D(T flags) …Run Code Online (Sandbox Code Playgroud) 今天有人断言你绝不应该在头文件中使用匿名命名空间.通常这是正确的,但我似乎记得有人告诉我,其中一个标准库在头文件中使用匿名命名空间来执行某种初始化.
我记得没错吗?有人可以填写详细信息吗?
前段时间我读了一篇文章解释了参数依赖查找的几个缺陷,但我再也找不到了.它是关于获取您不应该访问的东西或类似的东西.所以我想我会在这里问:ADL的缺陷是什么?
c++ namespaces overload-resolution argument-dependent-lookup
我想了解在XML Schema和WSDL中使用的targetNamespace的目的.实际上,为了简单起见,我们将这个问题限制为XML Schema.
我觉得我完全理解(简单)XML命名空间的概念.按照惯例,我们使用URI/URL,但我们可以使用任何字符串,然后我们将其分配给前缀以供XML节点和属性重用,或者仅用作手头作用域的默认命名空间.到现在为止还挺好 ?
现在进入XML Schema.出于某种原因,XML Schema的发明者认为简单命名空间的概念是不够的,他们不得不引入targetNamespace.我的问题是:targetNamespace引入了哪些重要的好处,而普通的XML命名空间无法提供这些好处?如果XML文档通过schemaLocation或import语句引用xsd文档,则在任何一种情况下,我都会给出引用的实际xsd文档的路径.这是唯一定义我想要引用的Schema的内容.如果另外我想将此Schema绑定到我的引用文档中的特定命名空间,为什么我必须复制已在我引用的XML Schema中定义的精确targetNamespace?为什么我不能简单地重新定义这个命名空间,但我想在XML文档中使用这个命名空间来引用我想引用的特定XML Schema文档?
更新:
举个例子,如果我在XML实例文档中有以下内容:
<p:Person
xmlns:p="http://contoso.com/People"
xmlns:v="http://contoso.com/Vehicles"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://contoso.com/schemas/Vehicles
http://contoso.com/schemas/vehicles.xsd
http://contoso.com/schemas/People
http://contoso.com/schemas/people.xsd">
<name>John</name>
<age>28</age>
<height>59</height>
<v:Vehicle>
<color>Red</color>
<wheels>4</wheels>
<seats>2</seats>
</v:Vehicle>
</p:Person>
Run Code Online (Sandbox Code Playgroud)
为什么例如people.xsd Schema需要定义一个"http://contoso.com/schemas/People"的targetNamespace?为什么我们需要xsd文档中的targetNamespace定义?在我看来,您必须从schemaLocation的名称空间部分获得的所有内容已经包含在XML实例文档中.在xsd文档中强制存在具有相等值的targetNamespace有什么好处?
保罗回答的后续问题:
你能给我一个具体的例子,说明xsd元素名称之间的这种"冲突"变得明显,这可以解释对targetNamespace的需求吗?
好的,这是试图回答我自己的问题.如果它对您来说似乎是连贯的,请告诉我.查看保罗链接页面上的示例帮助了我.
如果我们在上面的原始问题中采用XML实例示例,我们有两个对车辆元素定义的引用.一个在XML实例文档本身中是显式且可见的,但我们还必须想象person.xsd XML Schema再次引用相同的车辆定义作为person的允许子元素.如果我们使用的每个文件都允许定义自己的车辆命名正常的命名空间,我们怎么会知道XML实例引用相同的XML模式定义为车辆因为是person.xsd?唯一的方法是强制执行命名空间的概念,该概念比原始的简单概念更严格,并且必须在多个文档中以完全相同的方式编写.
如果我不在平板电脑上写这个,我会提供一个代码示例,但在这里我将尝试描述我想到的例子.
想象一下,我们对车辆元素有两种不同的XML Schema定义.LOCATION1/vehicles.xsd将包含从该职位的问题验证(包含颜色,车轮和座位子元素)的例子中的定义,而LOCATION2/vehicles.xsd将包含一个完全不同的定义的车辆元件(比方说,包含子元素年份,型号和体积).现在,如果XML实例文档引用了location1 Schema,就像上面示例中的情况一样,但是person.xsd说person元素可以包含在location2 Schema中定义的类型的vehicle子元素,那么没有概念对于targetNamespace,XML实例将验证,即使它显然没有正确类型的车辆作为其person元素的子元素.
目标命名空间然后帮助我们确保如果两个不同的文档引用相同的第三个XML模式,它们都是引用相同模式的契约,而不仅仅是包含相似但彼此不相同的元素的模式. .
这有任何意义吗 ?
我想在命名空间中获取所有类.我有这样的事情:
#File: MyClass1.php
namespace MyNamespace;
class MyClass1() { ... }
#File: MyClass2.php
namespace MyNamespace;
class MyClass2() { ... }
#Any number of files and classes with MyNamespace may be specified.
#File: ClassHandler.php
namespace SomethingElse;
use MyNamespace as Classes;
class ClassHandler {
public function getAllClasses() {
// Here I want every classes declared inside MyNamespace.
}
}
Run Code Online (Sandbox Code Playgroud)
我想get_declared_classes()里面getAllClasses(),但MyClass1并MyClass2没有在列表中.
我怎么能这样做?