我在互联网上的不同文章中看过很多,也听说过很多名称空间是古老而邪恶的东西。我听说过很多人应该使用带有模块加载器而不是命名空间的模块,但我只是不明白使用它们的客观好处是什么。我读过关于命名空间的不同论点,但它们对我来说似乎并不那么令人信服。我将列出一些论点,你们请尝试用一些真实世界的例子来解释我为什么这些论点是有效的:
使用模块,消费者决定导入变量的名称。命名导入的能力真正给了我什么?有 2 个名为 angular 的变量的可能性有多大?在那些罕见的变量名重复的情况下,我们不能这样做(我没有测试过这个,但理论上应该可以):
var someOtherName = angular;
var angular = function() {
};
Run Code Online (Sandbox Code Playgroud)带有模块加载器的模块使打包更容易,因为它们将脚本按正确的顺序排列。但是,当您通过在每个文件的顶部添加导入来明确告诉他们顺序时,他们为什么不这样做呢?类似地,当您使用 tsconfig.json 中的“outFile”选项将三重斜杠引用放在文件顶部时,Typescript 会以正确的顺序构建您的 JavaScript。这和进口有什么区别?
模块加载器提高了性能。这个真的让我很困惑。假设我使用 Typescript 或 .NET 框架的捆绑工具生成一个巨大的 JavaScript 文件,性能会不会相同,因为在任何一种情况下我们都会有 1 个文件?SystemJS 根据需要动态加载这些脚本。这个更有意义,但如果我最终有一个 25kb 的 JavaScript 文件,如果它按需加载每个 kb,我真的会有多少性能提升?毕竟,它只有 25kb。
即使假设模块和模块加载器比捆绑成一个文件并在 html 中引用它更好,如果我使用模块加载器来构建库,这是否意味着使用我的库的任何人也需要安装加载器依赖项?
先感谢您。
javascript namespaces module bundling-and-minification typescript
该命名空间章节给出相关的一个例子D3.d.ts,我不明白。
这是完整的示例:
declare namespace D3 {
export interface Selectors {
select: {
(selector: string): Selection;
(element: EventTarget): Selection;
};
}
export interface Event {
x: number;
y: number;
}
export interface Base extends Selectors {
event: Event;
}
}
declare var d3: D3.Base;
Run Code Online (Sandbox Code Playgroud)
我真正不明白的是我将如何在我的模块或我的打字稿脚本中使用D3.d.ts?请给我一些简短的例子。
编辑
请忽略这里使用 D3 的事实;可能是 B3 或 G3 或 X7 ......随便;我对特定的图书馆不感兴趣。我只对如何使用在我的打字稿模块和打字稿脚本中给出的示例感兴趣。
EDIT2 最让我困惑的是上面的例子使用了declare namespace ...而不是namespace D3(例如用于namespace Validation)。还有什么用(以及如何使用?)declare var d3: D3.Base; ?
我是 symfony 的新手。
我正在尝试学习一些教程,但我坚持使用 ORM
我使用以下命令生成了一个实体:
php bin/console make:entity
Run Code Online (Sandbox Code Playgroud)
我的实体有一个字段“名称”,因此有一个函数 setName()
我用以下命令生成了一个控制器:
php bin/console make:controller TestController
Run Code Online (Sandbox Code Playgroud)
在此控制器中,我尝试注册一个新条目,但出现以下错误:
试图从命名空间“App\Controller”调用函数“setName”。
我做错了什么?
测试控制器.php:
<?php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Entity\Team;
class TestController extends Controller
{
/**
* @Route("/test", name="test")
*/
public function index()
{
$entityManager = $this->getDoctrine()->getManager();
$team = new Team();
$team.setName("Marvels 6");
$entityManager->persist($team);
$entityManager->flush();
return $this->json([
'message' => 'Welcome to your new controller!',
'path' => 'src/Controller/TestController.php',
]);
}
}
Run Code Online (Sandbox Code Playgroud)
团队.php:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\TeamRepository") …Run Code Online (Sandbox Code Playgroud) 我使用不使用命名空间的第三方 dll,它包含一个名为Speaker.
// Decompiled with JetBrains decompiler
// Type: Speaker
// Assembly: StreamSDK, Version=1.0.6782.19546, Culture=neutral,PublicKeyToken=null
// MVID: 82353EB3-505A-4A47-8EEB-ED74ED4FC9B9
// Assembly location: /Users/haha/test/Assets/_ThirdParty/SteamSDK/Core/XMLSerializer/StreamSDK.dll
public enum Speaker
{
remote,
local,
none,
}
Run Code Online (Sandbox Code Playgroud)
我的本地项目在指定的命名空间下也有这个类名Photon.Voice.Unity;。导入 dll 后,发生错误,因为编译器将本地Speaker视为第三方的Speaker.
我已经在本地项目中使用了命名空间:
using Photon.Voice.Unity;
Run Code Online (Sandbox Code Playgroud)
错误发生在以下代码中:
private void OnSpeakerCreated(Speaker speaker)
{
speaker.gameObject.transform.SetParent(this.RemoteVoicesPanel, false);
}
Run Code Online (Sandbox Code Playgroud)
错误:
error CS1061: 'Speaker' does not contain a definition for 'gameObject' and no accessible extension method 'gameObject' accepting a first argument of type 'Speaker' could be found …Run Code Online (Sandbox Code Playgroud) 当我MyClass在命名空间中有一个 C++ 类时mynamespace,我将它的方法实现为
void mynamespace::MyClass::method() { … }
Run Code Online (Sandbox Code Playgroud)
我可以将其包装在命名空间中以将各个定义缩短为
namespace mynamespace {
void MyClass::method() { ... }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免重新输入MyClass::,以便我可以{在签名更改时更轻松地将 之前的所有内容复制到标题作为原型,而不必MyClass::每次都删除?
我想“一个类也是一个命名空间,也许我可以做到”
namespace mynamespace::MyClass {
void method() { ... }
}
Run Code Online (Sandbox Code Playgroud)
但这抱怨我将 MyClass 重新定义为不同的东西。using mynamespace::MyClass;也不起作用(但无论如何都会很糟糕,因为如果它起作用,我将如何在该文件中该行下方的任何位置声明一个独立函数)。
是否有解决方案,或者在 C++ 中根本不可能?
:: 是什么意思,前面没有任何东西
::flann::SearchParams param_k_;
Run Code Online (Sandbox Code Playgroud)
我在一个项目上遇到以下错误,但在另一个项目上没有。
error C2079: 'pcl::KdTreeFLANN<pcl::PointXYZ,flann::L2_Simple<float>>::param_radius_' uses undefined struct 'flann::SearchParams'
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我了解一致 :: 的用途以及如何解决问题?
我知道命名空间在 C++ 中是如何工作的,但我对它们在 C 中的工作方式有点困惑。所以,我对 C 中的命名空间做了一些研究。
首先,ISO/IEC 9899:2018 (C18) 第 6.2.3 节中的相应部分:
6.2.3 标识符的命名空间
1 如果在翻译单元中的任何一点都可以看到多个特定标识符的声明,则句法上下文会消除引用不同实体的用法的歧义。因此,各种类别的标识符都有单独的名称空间,如下所示:
— 标签名称(通过标签声明和使用的语法消除歧义);— 结构、联合和枚举的标签(通过关键字 struct、union 或 enum 的 any(32) 消除歧义);
——结构或工会的成员;每个结构或联合都有一个单独的名称空间用于其成员(通过用于通过 . 或 -> 运算符访问成员的表达式类型消除歧义);
— 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。
32) 标签只有一个命名空间,尽管三个是可能的。
所以这让我对 C 中的术语有了更多的理解,并且似乎通常与 C++ 具有相同的目的。但不幸的是,标准中没有进一步说明名称空间在 C 中的工作方式。
显然,它与共享相同标识符的实体之间的区别有关,并且与 C++ 不同,我们在其中声明命名空间,例如:
namespace ctrl1
{
int max = 245;
}
Run Code Online (Sandbox Code Playgroud)
并使用命名空间,例如:
using namespace ctrl1;
Run Code Online (Sandbox Code Playgroud)
或者
int a = ctrl1::max;
Run Code Online (Sandbox Code Playgroud)
在 C 中,如果使用了相应的标识符,编译器能够自动消除某个对象的某种用法的歧义。如果我错了纠正我。
这是如何运作的?编译器如何知道他是否应该在 C 中使用一个实体而不是另一个实体?
我已经阅读了 c++ 和 c 中的命名空间但问题更侧重于 C++ 并侧重于特定示例的处理。
我还阅读了C中的 …
应该是一个简单的问题,但我现在正在努力将一些辅助函数包装在命名空间中一个小时。由于我需要不需要在类中的辅助函数,我建议将它们包装到命名空间中,而不是将它们全部设为静态。另见此处:http : //isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
问题是,无论我做什么,都会遇到不同的错误。那么在不创建类的情况下使用自己的命名空间编写函数的正确方法是什么?让我们以下面的例子为例。我已经尝试过它的不同变体。
我的头文件:
#ifndef BINARYCONVERTER_HPP
#define BINARYCONVERTER_HPP
#include <iostream>
namespace binary_converter {
int myFunction(void);
}
#endif
Run Code Online (Sandbox Code Playgroud)
还有我的源文件:
#include "binary_converter.hpp"
int myFunction(void) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
所以,我一直在努力减少using namespace std,因为我现在有点明白它会在代码中引起什么冲突,即使我不会很快使用别人的代码,我想训练自己使用良好的做法...
但我仍然不喜欢当你在代码上撒上作用域运算符时代码的样子,我遇到的一个建议是使用typedefs自定义外观,我写的是:
#include <iostream>
#include <fstream>
#include <string>
typedef std::cout std_cout;
typedef std::endl std_endl;
typedef std::string std_string;
typedef std::fstream std_fstream;
typedef std::ios std_ios;
Run Code Online (Sandbox Code Playgroud)
现在,当我输入这个时,一切都很好,除了前两行(在第二个代码块中),它们分别给了我variable "std::cout" is not a type name和function template "std::endl" is not a type name错误消息。
现在,如果我typedef用#defines替换所有s ,问题最初似乎已经解决了,但是我最终会在包含这些定义之一的每一行中出现大量语法错误。(此外我知道这#define也同样有问题,using namespace std所以我也试图避免那个)
更复杂的是,第一行(在同一块中)是这里两条有问题的行之一,与我在网上的众多来源中看到的完全相同,所以我不知道是什么对了……
如何正确定义数据类型?
提前致谢。
我编写了将生日日期转换为年龄的那些代码行。
我将在许多控制器和许多路由功能中使用此代码!所以我决定把它放在一个函数中,然后调用calculate_age().
我的问题是我怎么可以声明函数或任何功能 一旦里面的namespace App\Controller;?所以我可以在所有控制器中使用它。
功能代码:
public function calculate_age($birthday): ?int
{
$current_date = date('d-m-Y', time());
$info = explode(' ', $birthday);
$months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
$numbers = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
$i = 0;
for ($i = 0; $i <= 11; ++$i) {
if ($info[2] == $months[$i]) {
$info[2] = $numbers[$i];
}
}
$all = $info[1].'-'.$info[2].'-'.$info[3];
$difference = …Run Code Online (Sandbox Code Playgroud) namespaces ×10
c++ ×4
symfony ×2
typescript ×2
ambient ×1
c ×1
c# ×1
declaration ×1
entity ×1
function ×1
identifier ×1
javascript ×1
module ×1
name-lookup ×1
opencv ×1
php ×1
symfony4 ×1
typedef ×1