Scala代码:
trait Box {
def put(num:Int) = println("Put number: " + num)
}
trait DoubleBox extends Box {
override def put(num:Int) = super.put(2*num)
}
object MyBox extends Box with DoubleBox
MyBox.put(3)
Run Code Online (Sandbox Code Playgroud)
它工作正常并打印 6
但是当我尝试:
object MyBox extends Box with DoubleBox with DoubleBox
Run Code Online (Sandbox Code Playgroud)
它无法编译:
error: trait DoubleBox is inherited twice
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我的代码看起来合理时有这样的限制?
我想在泛型类中使用int,它需要通用类来实现core :: cmp :: PartialEq trait.我知道int正在实现它,因为我可以做4!= 5.问题是编译器无法识别并触发以下错误:
错误:无法推断出足够的类型信息来定位
core::cmp::PartialEq该类型的特征的impl<generic integer #2>; 类型注释需要src/binary_tree.rs:80 let tree = Node :: new_node(方框10);src/binary_tree.rs:80:13:80:27注意:特性
core::cmp::PartialEq必须实现,因为它是必需的Node<T>::new_node
你能帮我找一下int的partialeq的实现吗?
我创建了这个小Scala示例,以了解更好的特征.
trait Writer {
def write(value: Int): Unit = {
print("Writer")
}
}
trait Hdd extends Writer {
override def write(value: Int): Unit = {
print("Hdd")
}
}
trait File extends Writer {
override def write(value: Int): Unit = {
print("File")
}
}
class TestClass extends App {
(1) val myWriter = new Writer with Hdd // This line looks fine
(2) val myNewWriter = new Writer // This line fail
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,不可能实例化Trait,因此第(2)行失败了.
但由于某种原因,我无法理解,第(1)行看起来很好.
这怎么可能?
我printData()在MyInterface.php和中创建了相同的方法,MyTrait.php我printData()从我的控制器调用方法来实现MyInterface.php和使用MyTrait.php.但是这个方法总是来自MyInterface.php.请解释一下为什么会这样?
MyInterface.php
<?php namespace App\Interfaces;
interface MyInterface
{
public function printData();
}
Run Code Online (Sandbox Code Playgroud)
MyTrait.php
<?php namespace App\Traits;
trait MyTrait
{
public function printData()
{
dd("From Trait");
}
}
Run Code Online (Sandbox Code Playgroud)
HomeController.php
<?php namespace App\Http\Controllers;
use App\Interfaces\MyInterface;
use App\Traits\MyTrait;
use App\User;
class HomeController extends Controller implements MyInterface
{
use MyTrait;
public function index()
{
$this->printData();
}
public function printData() {
// TODO: Implement printData() method.
dd("From Interface");
}
}
Run Code Online (Sandbox Code Playgroud) 我无法绕过这个,因为我在另一个项目上有这个并且工作得很好.它目前给我这个错误
Symfony\Component\Debug\Exception\FatalErrorException(E_UNKNOWN)Trait'App\Traits\ResponseTrait'未找到
UserRepository工作正常,特性没有.我已经尝试重命名特征,将其移动到存储库文件夹,chmod到777,我不知道什么是错的.
认识我的HomeController,laravel的默认设置:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Repositories\UserRepository as User;
use App\Traits\ResponseTrait;
class HomeController extends Controller
{
use ResponseTrait;
private $user;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//dd($this->user->all()->toArray());
//You can ignore the self:: part, as it doesn't reach this far.
self::setData($this->user->all()->toArray());
return "test";
return view('home');
} …Run Code Online (Sandbox Code Playgroud) parseRust的str原始类型的方法签名是
pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
Run Code Online (Sandbox Code Playgroud)
为什么不如下?
pub fn parse<F: FromStr>(&self) -> Result<F, F::Err>
Run Code Online (Sandbox Code Playgroud)
我想也许原始演员会确保Err解决FromStr::Err,而不是SomeOtherTrait::Err.
不过,考虑到parse文档中的以下行...
parse可以解析实现FromStr特征的任何类型
为什么没有特质限制?
在像Clojure这样的动态语言中,很容易表达不同类型的集合:
{:key1 "foo", :key2 [34 "bar" 4.5], "key3" {:key4 "foobar"}}
Run Code Online (Sandbox Code Playgroud)
在Rust中,实现此类集合的首选方法是使用特征对象或枚举.使用Any特征对象似乎是最灵活的方法(如果没有固定数量的已知类型替代方法),因为它允许向下转换为实际的对象类型:
let mut vector: Vec<Box<Any>> = Vec::new();
vector.push(Box::new("I’m"));
vector.push(Box::new(4 as u32));
console!(log, vector[0].downcast_ref::<&str>());
console!(log, vector[1].downcast_ref::<u32>());
Run Code Online (Sandbox Code Playgroud)
这种方法似乎是不鼓励的.它的缺点是什么?
我是Laravel的初学者,在学习"命名空间"和"使用"语句时,我发现,例如,在Controllers中,当我们第一次编写"use"语句时,它应该在函数内部重复.
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
Run Code Online (Sandbox Code Playgroud)
为什么这样工作呢?为什么在不重复函数的情况下编写"use"语句就不够了?而且,如果我要创建另一个具有相同命名空间的Controller,我是否应该在那里编写相同的"use"语句?
我到处都读到我们无法实例化特征,但是当我运行这段代码时,它运行良好。我对scala的特性感到困惑,有人可以解释一下。
trait X {
def a: Int
def b: String
}
object test {
def main(args: Array[String]) {
new X() {
override def a: Int = 1
override def b: String = "as"
}
}
Run Code Online (Sandbox Code Playgroud) 下面的代码显示了mixin。
trait A{
def a = 1
}
trait X extends A{
override def a = {
println("X")
println((super.a + 3).toString)
super.a + 3
}
}
trait Y extends A{
override def a = {
println("Y")
println((super.a + 5).toString)
super.a + 5
}
}
val xy = new AnyRef with X with Y
xy.a
Run Code Online (Sandbox Code Playgroud)
代码的输出是
Y
X
4
9
X
4
Run Code Online (Sandbox Code Playgroud)
我已经读过混合两个或多个特征的用法,显示从最右边到最左边开始的可堆叠行为,并使用线性化解决了对super()的调用。但是从输出来看,似乎X被调用了两次。请解释输出。
traits ×10
scala ×4
laravel ×3
php ×3
rust ×3
inheritance ×2
collections ×1
generics ×1
interface ×1
namespaces ×1
polymorphism ×1