当前位置: 首页 > news >正文

地方志网站建设自查报告销售管理系统

地方志网站建设自查报告,销售管理系统,成都手机微信网站建设报价,网站设计做哪些准备介绍 Kotlin可能现在是我最喜欢的语言#xff0c;并且它可能提供的最酷的功能之一是基于几个功能构建的类型安全的生成器#xff08;稍后解释#xff09;。 我发现自己真的很想在其他两种主要语言#xff08;Java和Python#xff09;中使用此功能。 本文解释了我认为与使用… 介绍 Kotlin可能现在是我最喜欢的语言并且它可能提供的最酷的功能之一是基于几个功能构建的类型安全的生成器稍后解释。 我发现自己真的很想在其他两种主要语言Java和Python中使用此功能。 本文解释了我认为与使用这些语言的类型安全的构建器最接近的东西。 Kotlin 首先我需要说明Kotlin进行类型安全的构建器的能力。 要快速了解这些构建器的含义您应该查看有关它们的页面 。 在本文中我们将实现其html构建器的一小部分。 Kotlin创建类型安全的构建器的能力归功于许多小功能。 第一个是lambda语法 {param, list - block.of.code()} 。 如果lambda的参数为零则可以忽略参数列表和箭头。 当它只有一个参数时也是如此因为该参数被隐式称为it 。 例如 {doSomethingWith(it)}是合法的lambda假设doSomethingWith()接受的对象与传递给lambda的对象的类型相同。 下一个功能是如何将lambda传递给函数。 如果最后一个参数是lambda则可以在函数调用的括号后传递该参数。 例如 myFunc(arg1){lambdaArg()} 。 如果lambda是唯一的参数则可以完全忽略括号 aFunc{lambdaArg()} 。 这使您可以定义看起来像语言功能的功能。 如果不是因为保留了这些关键字就可以从技术上定义自己的if-else块或任何循环。 接下来是扩展方法您可以定义像它们一样工作的lambda。 扩展方法是为接口类之外的类或接口定义的新方法。 例如您可以为String类创建新的方法。 实际上它们只是静态方法它们采用其所针对类型的隐式第一个参数。 在Kotlin代码中第一个参数分配给this标识符 this标识符隐式使用就像在实际方法中一样。 您也可以定义像扩展方法一样工作的lambda SomeClass.() - Unit而不是(SomeClass) - Unit 以便在lambda内部您可以调用对象而无需显式引用它。 所有这些功能再加上非常好的类型推断共同构成了一种功能可以从使用扩展lambda的函数中创建类型安全的构建器。 因此我们可以这样写 html {head {title(A Title)}body {p paragraphp nother onep last paragraph} } 要返回Html包含对象Head和Body 将Head包含Title与文字“A标题”。 Body包含3个Paragraphs 。 您可能会注意到title和[p]的定义方式不同。 它可能会是聪明有title使用语法代替p 但p展示了这些建设者如何素材可以是优于title 。 我用Python做过类似的事情因为它也支持属性。 让我们看一下允许创建这些对象的Kotlin代码 fun html(htmlBuilder: Html.() - Unit): Html {val html Html()html.htmlBuilder()return html }class Html {private var head: Head? nullprivate var body: Body? nullfun head(headBuilder: Head.() - Unit) {head Head()head?.headBuilder()}fun body(bodyBuilder: Body.() - Unit) {body Body()body?.bodyBuilder()} } 我们从Html类和用于启动构建器的html()函数开始。 html函数不是必需的因为该代码可以用作Html构造函数但是它使我们能够使构造函数保持简单并且所有函数都小写而不违反命名约定。 您会注意到实际上一切都还很短。 只有html函数是3行这仅仅是因为它必须在最后返回结果。 如果我们在Html上使用构造函数那么它将只有htmlBuilder() 。 这里的Head及Title 。 class Head {private var title: Title? nullfun title(text: String) {title Title(text)} }class Title (private val text: String) { } 进行得还不错。 Title不需要构建器因为它仅包含文本。 如果不是因为需要一些更复杂的构建机制我实际上会让Head只握住String本身而不是创建Title类和对象。 class Body {private val paragraphs: ArrayListParagraph ArrayList()var p: Stringprivate get() null!!set(value) {paragraphs.add(Paragraph(value))} }class Paragraph (private val text: String) { } 这是真正有趣的事情。 与使用Title方法不同我们没有使用p()方法而是使用p的setter来将Paragraph对象添加到列表中。 在这种情况下它不是最直观的。 它只是在这里向您展示如何利用这些构建者来发挥创造力。 还要记住这些类只是构建器类因此允许它们是有状态的。 应该有一个build()方法该方法递归地调用所有封闭对象的build()方法以创建一个不错的不变的对象。 Java 在Java中您几乎可以创建完全相同的类除了生成器看起来不那么干净之外因为它没有上面的所有可爱功能。 因此首先开始这是构建器代码的最终外观。 html(html - {html.head(head -head.title(A Title));ht.body(body - {body.p(paragraph);body.p(nother one);body.p(last paragraph);}); }); 这是接近的建设者语法你可以在Java中获得。 请注意 title()和p()的调用方式没有什么区别因为Java不提供任何类似于属性的构造。 另外请注意您需要为所有内容起一个名字。 使用隐式this 您必须编写类似于hd.title(...)而不仅仅是title(...) 这甚至没有提到我们必须为lambda定义参数列表这一事实。 您还可以做其他几件事但更糟糕的是第一件事就是使用常规代码 Html html new Html();Head head html.head();head.title(A Title);Body body html.body();body.p(paragraph);body.p(nother one);body.p(last paragraph); 这并不可怕 但是由于缺少完整类型推断我必须指定head和body属于其各自的类型它最终变得相对冗长由于没有括号所以多余的制表符纯粹是为了外观用过的。 我想到的另一种方法将在Python版本之后显示因为它试图复制该版本。 因此让我们看一下代码 public class Html {public static Html html(ConsumerHtml htmlBuilder){Html html new Html();htmlBuilder.accept(html);return html;}private Head head null;private Body body null;public void head(ConsumerHead headBuilder) {head new Head();headBuilder.accept(head);}public void body(ConsumerBody bodyBuilder) {body new Body();bodyBuilder.accept(body);} } 这与直接移植到Java一样直接。 html()函数已作为静态方法移入Html类因为它必须放在 Java中。 我们使用了ConsumerHtml 因为这是Java与我们想要的lambda最为接近的东西。 这里是Head和Title public class Head { private Title title null;public void title(String text) {title new Title(text);} }public class Title {private final String text;public Title(String text) {this.text text;} } 这里没有太多注意事项。 这可能与您的期望有关。 现在以“ Body Paragraph结束。 public class Body {private final List paragraphs new ArrayList();public void p(String text) {paragraphs.add(new Paragraph(text));} }public class Paragraph {private final String text;public Paragraph(String text) {this.text text;} } 几乎感觉像不值得编写这些类不是吗它们是如此简单。 请记住这是准构建器部分。 同样此代码实际上并不包含用于构建实际的不变的DOM树的功能。 这就是构建Java版本所需要的。 除了一些语法上的冗长之外用Java创建比使用Kotlin几乎容易得多因为没有任何其他功能可以考虑和使用P Python 试图找出一种在Python中执行类似操作的方法这使我很幸运地看到了一个视频该视频展示了使用上下文管理器 with语句的新颖但不直观的方法。 Python中的问题在于lambda只允许具有单个表达式或语句。 上下文管理器通过有效地允许您在可以在上下文管理器内使用的条目上返回一个对象或不返回任何对象从而允许非常有限的方式绕过单行lambda就像在lambda内一样。 因此例如构建器在Python中如下所示 myhtml Html() with myhtml as html:with html.head() as head:head.title(A Title)with html.body() as body:body.p paragraphbody.p nother onebody.p last paragraph 这实际上看起来像是浪费因为这几乎可以很容易地写成以下内容 html Html() head html.head() head.title(A Title) body html.body() body.p paragraph body.p nother one body.p last paragraph with块的最大好处是缩进因为Python由于在花括号上使用缩进因此具有缩进限制。 为此上下文管理器可能值得。 但是在向您展示了用Python制作这些代码所需的基本代码之后我还将在书中谈到另一个好处 class Html:def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):return Falsedef head(self):self._head Head()return self._headdef body(self):self._body Body()return self._body 在这里你可以看到Html类具有所需的__enter__()和__exit__()方法是一个上下文管理器。 他们几乎什么也不做 __enter__()仅返回self 而__exit__()仅表示它__exit__()任何可能传入的异常__exit__() head()和body()方法几乎可以满足您现在的期望 Head和Body也是上下文管理器类型的假设。 class Head:def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):return Falsedef title(self, text):self._title Title(text)class Title:def __init__(self, text):self.text textclass Body:p property()def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):return Falsep.setterdef p(self, text):if not hasattr(self, paragraphs):self.paragraphs []self.paragraphs.append(Paragraph(text))class Paragraph:def __init__(self, text):self.text text 唯一值得关注的新事物是在Body中为其p标签使用了property 。 幸运的是我们并不需要对干将property 我们需要有返回小号None 就像在Kotlin。 好的现在我们来看一个有趣的不太明显的原因在这种情况下使用上下文管理器会有所帮助。 在Java和Kotlin中我们最终需要对build()方法进行一次额外的调用或者让html()函数为我们完成并让它最后一次全部进行递归遍历照顾它。 使用上下文管理器 __enter__() __exit__() __enter__()和__exit__()方法可以在进入时传递对象的生成器版本然后在退出时进行构建。 这意味着构建器的每个中间阶段在退出时已经包含完整构建的版本。 实际上将头缠绕起来可能有点困难。 这是一个使用Html HtmlBuilder和Head进行部分实现的示例 class Html:def __enter__(self):self._builder HtmlBuilder()return self._builderdef __exit__(self, exc_type, exc_val, exc_tb):self.head self._builder._headself.body self._builder._bodydel self._builderreturn Falseclass HtmlBuilder:def head(self):self._head Head()return self._headdef body(self):...class Head:def __enter__(self):self._builder HeadBuilder()return self._builderdef __exit__(self, exc_type, exc_val, exc_tb):self.title self._builder._titledel self._builderreturn False 在这里 Html对象的__enter__()方法创建并保存一个生成器然后将其返回。 在__exit__() 它从存储在构建器中的值构建自身并从自身中删除构建器。 一经考虑至少对于我来说可能会认为存储在构建器上的对象不是完成的对象而是完成的对象。 使用HtmlBuilder的head()方法和Head的实现可以看到builder对象上的方法返回具有其自己的__exit__() __enter__()和__exit__()方法的适当类这些类也将保证其正确构建。 使用此设置调用代码实际上仍然与第一次相同。 最后一件事既然我们知道可以使用上下文管理器来执行此操作那么您可能会认为Java的try资源管理器实际上可以正常工作。 而且你会是对的。 实际上它的最终语法除了随机try关键字之外也比lambda版本更干净。 调用时资源管理器的版本如下所示 Html html Html(); try(html) {try(Head head html.head()) {head.title(A Title);}try(Body body html.body()) {body.p(paragraph);body.p(nother one);body.p(last paragraph);} } 在这一点上我将留给您尝试并弄清楚如何实现它。 提示我认为它不能像Python构建的第二个版本那样工作它会随其构建。 我认为此Java版本代码中的所有内容都需要构建器直到最后您在html上调用build()方法以创建真实版本。 奥托罗 天哪这东西最终有点长不是吗 我希望您能从此练习中获得一些乐趣因为我不确定它的实际用途除了了解您可以使用上下文管理器模拟0或1参数lambda外还可以。 可悲的是我从来没有像在Kotlin网站的示例中那样谈论添加其他参数例如在函数调用中分配类id等。 Kotlin还具有其他功能可以使它真正干净和容易但是本文显然没有足够的空间。 下周我会解决。 谢谢阅读 注意截至昨天所有编辑已完成。 从这里开始我“只是”需要设计一个我有想法的封面 获取所有印刷版和电子书版的格式 编写附录大部分只是本书中的代码片段的集合充实了更多内容 并完成GitHub存储库的编写该库将具有所有超级有用的类和函数可更快更轻松且更少的问题来构建自己的描述符。 我希望所有这些工作都能在夏季结束之前完成但希望能早日完成。 我的生活将变得更加忙碌所以我不知道我能花多少时间来完成所有这些工作。 翻译自: https://www.javacodegeeks.com/2016/01/mimicking-kotlin-builders-java-python.html
http://www.pierceye.com/news/185953/

相关文章:

  • 医院网站建设方案策划书把网站做成app的软件下载
  • 网站建设实践报告3000字wordpress消息提示插件
  • 网站制作的评价标准做网站后台需要什么
  • 学院网站建设服务宗旨实惠的网站建设产品
  • 网站改名 备案影视制作
  • 网站开发亿码酷技术网站建设选谋者
  • 智能家居网站模板怎样做网站标题优化
  • 深圳制作网站制作公司哪家好最简洁 wordpress主题
  • 重庆忠县网站建设公司推荐国内公关公司
  • 给彩票网站做代理违法吗wordpress文章与页面关联
  • 网站标题加后缀模拟ip访问网站
  • 临清网站建设费用什么是网络营销的基础
  • 街道办的网站由谁做的企业首次建设网站的策划流程
  • 优化大师免费版下载一键优化下载安装
  • 网站建设近五年出版的书籍甘肃省工程建设信息官方网站
  • 杭州网站现场备案项目营销策划方案
  • 网站打包成app软件php网站 上传
  • 行业网站建设策划方案系部网站开发计划书
  • 建设部网站投诉核查做网站一般几个人
  • 360网站推广官网网址怎样在网站做咨询医生挣钱
  • 重庆市建设银行网站一站式网站建设有哪些
  • 自学设计软件的免费网站免费ppt模板简约
  • 申请个人网站怎么申请网站类型有哪些
  • 做网站推广托管注意哪个网站做推广好
  • 大竹网站建设泗阳城乡建设局网站
  • 山东省住房和城乡建设厅服务网站做网站的注意点
  • 网站排名优化软件江西网站备案要求
  • 桐柏县建设局网站邢台建设局网站
  • 网站域名变更怎么查英国做网站的人
  • 嘉兴公司的网站设计wordpress 送女友